Py

Python

Posted by wx_x on 2021-12-07
Words 13.8k and Reading Time 56 Minutes
Viewed Times

python的些许笔记(Point)

C语言中文网:C语言程序设计门户网站(入门教程、编程软件) (biancheng.net)

于csdn的python技能树:(56条消息) 技能树

千万注意缩进规则,以前觉得没啥问题,自己肯定可以,但是真正使用起来跟没学差不多。

10/21/2021

pthon的缓存重用机制

image-20211021103708911

如图所示,我进行了相关实验,发现小于-5的也会分配到重用内存image-20211021103808112

(大量使用 id() 内置函数,该函数的功能是获取变量(对象)所在的内存地址)

是不是很神奇,哈哈,或许是升级了,也可能是你c语言网out了 🐕

(其实是因为自己比较懒,不想上网查原因,网上应该课可搜寻到,等我学完python再回头看看)

input():str = input(tipmsg)

注意类型转换,输入进去的无论什么都会变成str类型,那么如果我们需要对输入的进行

print()

类似C#,但是有些许不同,但是语言逻辑是十分相近,所以学习的时候不要担心学不会

一些典型运用:

1
2
age = 8
print("C语言中文网已经%d岁了!" % age)
1
2
3
4
name = "C语言中文网"
age = 8
url = "http://c.biancheng.net/"
print("%s已经%d岁了,它的网址是%s。" % (name, age, url))

还有一些输出形式的指定,比如正数带+,负数带-,左对齐方式输出,指定精度

转义字符及用法\

\0 开头表示后跟八进制形式的编码值

\x 开头表示后跟十六进制形式的编码值

ps:后面最多只能跟两位数字,所以八进制形式\0并不能表示所有的 ASCII 字符,只有十六进制形式\x才能表示所有 ASCII 字符

image-20211021112953344

位运算与逻辑运算等运算

位运算

只对整数,与数据在内存中的存储格式有关。

逻辑

在 Python 中,and 和 or 不一定会计算右边表达式的值,有时候只计算左边表达式的值就能得到最终结果。and只要有一个假的,那右边就不用再进行计算了。

另外,and 和 or 运算符会将其中一个表达式的值作为最终结果,而不是将 True 或者 False 作为最终结果。

三目运算

1
exp1 if contion else exp2

condition 是判断条件。exp1 和 exp2 是两个表达式。

如果 condition 成立(结果为真),就执行 exp1,并把 exp1 的结果作为整个表达式的结果;如果 condition 不成立(结果为假),就执行 exp2,并把 exp2 的结果作为整个表达式的结果。

运算符优先级

Python运算符优先级和结合性一览表 (biancheng.net)

列表,元组,字典和集合

索引

1
2
0  1  2  3  4  5...n 索引从左往右
-n -(n-1) -(n-2) -(n-3)...-1 负数从右向左

需要注意的点是

1
2
3
4
(abdce)
正数:str[1]=b
负数:str[-1]=e
也就是起始位,正数与负数不同

序列切片

1
2
3
4
访问一定范围的序列
#列表的创建用 [],后续讲解列表时会详细介绍
list = [None]*5
print(list)

检查元素是否包含在序列中

1
2
3
使用 in 关键字检查某元素是否为序列的成员
str="c.biancheng.net"
print('c'in str)

与序列相关的内置函数

image-20211108091421692

1
2
3
4
5
6
7
str="c.biancheng.net"
#找出最大的字符
print(max(str))
#找出最小的字符
print(min(str))
#对字符串中的元素进行排序
print(sorted(str))

列表

element1 ~ elementn 表示列表中的元素,个数没有限制,只要是 Python 支持的数据类型就可以

1
[element1, element2, element3, ..., elementn]

创建列表(栗子)

1
2
3
num = [1, 2, 3, 4, 5, 6, 7]
name = ["C语言中文网", "http://c.biancheng.net"]
program = ["C语言", "Python", "Java"]
1
nulllist=[] //列表可以为空
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
list()函数创建列表
#将字符串转换成列表
list1 = list("hello")
print(list1)

#将元组转换成列表
tuple1 = ('Python', 'Java', 'C++', 'JavaScript')
list2 = list(tuple1)
print(list2)

#将字典转换成列表
dict1 = {'a':100, 'b':42, 'c':9}
list3 = list(dict1)
print(list3)

#将区间转换成列表
range1 = range(1, 6)
list4 = list(range1)
print(list4)

#创建空列表
print(list())

result
['h', 'e', 'l', 'l', 'o']
['Python', 'Java', 'C++', 'JavaScript']
['a', 'b', 'c']
[1, 2, 3, 4, 5]
[]

有创就有删,21世纪套餐,增删改查

删除列表

1
del listname
1
2
3
testlist=[1,2,3,4]
del testlist
print(testlist) //报错

添加元素

1
2
3
4
5
a=[1]
b=[2]
c=a+b
print(c)
> 1,2
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
Python append()方法添加元素:
append() 方法用于在列表的末尾追加元素,obj 添加到列表末尾的数据
listname.append(obj)
l = ['Python', 'C++', 'Java']
#追加元素
l.append('PHP')
print(l)

#追加元组,整个元组被当成一个元素
t = ('JavaScript', 'C#', 'Go')
l.append(t)
print(l)

#追加列表,整个列表也被当成一个元素
l.append(['Ruby', 'SQL'])
print(l)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
Python extend()方法添加元素;
extend() 和 append() 的不同之处在于:extend() 不会把列表或者元祖视为一个整体,而是把它们包含的元素逐个添加到列表中
实例
l = ['Python', 'C++', 'Java']
#追加元素
l.extend('C')
print(l)
#追加元组,元祖被拆分成多个元素
t = ('JavaScript', 'C#', 'Go')
l.extend(t)
print(l)
#追加列表,列表也被拆分成多个元素
l.extend(['Ruby', 'SQL'])
print(l)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
Python insert()方法插入元素:
append() 和 extend() 方法只能在列表末尾插入元素,如果希望在列表中间某个位置插入元素,那么可以使用 insert() 方法。
实例
l = ['Python', 'C++', 'Java']
#插入元素
l.insert(1, 'C')
print(l)
#插入元组,整个元祖被当成一个元素
t = ('C#', 'Go')
l.insert(2, t)
print(l)
#插入列表,整个列表被当成一个元素
l.insert(3, ['Ruby', 'SQL'])
print(l)
#插入字符串,整个字符串被当成一个元素
l.insert(0, "http://c.biancheng.net")
print(l)
值得一提的是,插入的是元组的话,会有括号

还是那句话有增就有删

删除元素

1
del命令:不仅可以删除整个列表,还可以删除列表中的某些元素。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
#删除单个元素:del listname[index]
attention!!! index 表示元素的索引值。

#删除中间连续元素:del listname[start : end]
lang = ["Python", "C++", "Java", "PHP", "Ruby", "MATLAB"]
del lang[1: 4]
print(lang)

#pop():根据索引值删除元素:listname.pop(index)
注意!如果不写 index 参数,默认会删除列表中的最后一个元素,类似于数据结构中的“出栈”,“出队”操作

#remove():根据元素值进行删除:listname.remove(number)
remove() 方法只会删除第一个和指定值相同的元素,而且必须保证该元素是存在的,否则会引发 ValueError 错误。

#clear():删除列表所有元素:listname.clear()
#也可以是 del listname[:]

修改元素

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
#修改单个元素:listname[index]=修改值
index仍然是索引值
a=[2]
a[0]=1
print(a)
执行后:a=1

#修改一组元素:listname[start:end]=[x,x,...,x]
与上start:end同意思

#也可以用于插入元素:listname[index:index]=[x,x,...,x]
等于在index位置插入一组元素,切片语法,对空切片赋值。

#切片语法指定步长
nums = [40, 36, 89, 2, 36, 100, 7]
#步长为2,为第1、3、5个元素赋值
nums[1: 6: 2] = [0.025, -99, 20.5]
print(nums)
执行:
[40, 0.025, 89, -99, 36, 20.5, 7]

查找元素

列表(list)提供了 index() 和 count() 方法,它们都可以用来查找元素。

index()

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
index() 方法用来查找某个元素在列表中出现的位置(也就是索引);
如果该元素不存在,则会导致 ValueError 错误,所以在查找之前最好使用 count() 方法判断一下。
用法:
listname.index(obj, start, end)
解读参数:
obj表示将进行操作的元素
start 和 end 参数用来指定检索范围:
start 和 end 可以都不写,此时会检索整个列表;
如果只写 start 不写 end,那么表示检索从 start 到末尾的元素;
如果 start 和 end 都写,那么表示检索 start 和 end 之间的元素。
实例:
nums = [40, 36, 89, 2, 36, 100, 7, -20.5, -999]
#检索列表中的所有元素
print( nums.index(2) )
#检索3~7之间的元素
print( nums.index(100, 3, 7) )
#检索4之后的元素
print( nums.index(7, 4) )
#检索一个不存在的元素
print( nums.index(55) )
执行:
3
5
6
Traceback (most recent call last):
File "D:x/x/x/x.py", line 9, in <module>
print( nums.index(55) )
ValueError: 55 is not in list

count()

1
2
3
4
5
6
7
8
9
10
11
12
count() 方法用来统计某个元素在列表中出现的次数: listname.count(obj)
nums = [40, 36, 89, 2, 36, 100, 7, -20.5, 36]
#统计元素出现的次数
print("36出现了%d次" % nums.count(36))
#判断一个元素是否存在
if nums.count(100):
print("列表中存在100这个元素")
else:
print("列表中不存在100这个元素")
执行
36出现了3次
列表中存在100这个元素

注意事项

1
2
3
4
添加元素
'+':c=a+b时,c的内存地址与a和b均不一,是重新生成的。
extend: 处理列表后,没有返回值,故不可以使用链式表达式,也就是extend不可以放在等号右边,必须在左边,符合这个要求,extend和'+'生成的内容一致,但是extend不会重新创建一个a,而是改变a的内容,故extend效率较高。
append: 将b作为一个整体追加到a后面,也就是带一个中括号,与上述两种功能不同,注意区别。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
删除元素
需要注意的是使用del删除元素的时候,主要删除的是变量还是数据
实例
tt = 'hello'
#定义一个包含多个类型的 list
list1 = [1,4,tt,3.4,"yes",[1,2]]
l2 = list1
print(id(l2),id(list1))
del list1
print(l2)
print(list1)
执行
1765451922248 1765451922248
[1, 4, 'hello', 3.4, 'yes', [1, 2]]
Traceback (most recent call last):
File "D:x/x/x/x.py", line 8, in <module>
print(list1)
NameError: name 'list1' is not defined
解释
list1的值赋值给了l2,所以删除list1时,打印l2,l2 所指向的内存数据还是存在的,所以删除的list1是删除了变量list1,未删除指定数据

#此时就可以使用 del 关键字来回收内存,解決高并发状态时,无效内存占用。
操作:
#引入gc库
import gc
tt = 'hello'
#定义一个包含多个类型的 list
list1 = [1,4,tt,3.4,"yes",[1,2]]
del list1
#回收内存地址
gc.collect()

列表函数range

列表非常适合用于存储数字集合

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
 Python 提供了 range() 函数,可帮助我们高效地处理数字列表,即便列表需要包含数百万个元素,也可以快速实现。
Python range() 函数能够轻松地生成一系列的数字.range() 函数常常和 Python 循环结构、推导式(后续会讲,这里先不涉及)一起使用,几乎能够创建任何需要的数字列表
实例
#可以用于生成顺序字典
for value in range(1,5):
print(value)
执行
1
2
3
4
但是返回值并不是list类型,时range类型,如果需要返回list类型,可以list(range(1,10)),即可
#指定步长
实例
even_numbers = list(range(1,11,2))
print(even_numbers)
执行
[1, 3, 5, 7, 9]

list实现队列与栈方法

list实现队列(insert插入)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
queue=[]
queue.insert(0,1)
queue.insert(0,2)
queue.insert(0,3)
print(queue)
print(queue.pop())
print(queue.pop())
print(queue.pop())
print(queue)
执行
[3,2,1]
1
2
3
[]
实现队列先进先出

image-20211109144623927

list实现栈(append插入)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
stack=[]
stack.append(1)
stack.append(2)
stack.append(123123131)
print(stack)
print(stack.pop())
print(stack.pop())
print(stack.pop())
执行
[1, 2, 123123131]
123123131
2
1
实现先进后出,栈的功能

collections模块实现栈和队列

上述实现队列与栈的效率过低,调用标准库, collection模块中的deque结构体

注意调用语法

1
from collecions import deque

image-20211109145738795

元组(tuple)

元组(tuple)是 [Python] 中另一个重要的序列结构,和列表类似,元组也是由一系列按特定顺序排序的元素组成。

元组和列表(list)的不同之处在于:

  • 列表的元素是可以更改的,包括修改元素值,删除和插入元素,所以列表是可变序列;
  • 而元组一旦被创建,它的元素就不可更改了,所以元组是不可变序列。
  • 元组要比列表更加轻量级,所以从总体上来说,元组的性能速度要优于列表。
  • Python元组和列表的区别 (biancheng.net)太多了,不好记,放在这里不记得再看

创建元组

在 Python 中,元组通常都是使用一对小括号将所有元素包围起来的,但小括号不是必须的,只要将各元素用逗号隔开,Python 就会将其视为元组,请看下面的例子,

需要注意的一点是,当创建的元组中只有一个字符串类型的元素时,该元素后面必须要加一个逗号,,否则 Python 解释器会将它视为字符串

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
使用 ( ) 直接创建
tuplename = (element1, element2, ..., elementn)
实例
course = "Python教程", "http://c.biancheng.net/python/"
print(course)
执行
('Python教程', 'http://c.biancheng.net/python/')

使用tuple()函数创建
tuple(data)
实例
#将字符串转换成元组
tup1 = tuple("hello")
print(tup1)

#将列表转换成元组
list1 = ['Python', 'Java', 'C++', 'JavaScript']
tup2 = tuple(list1)
print(tup2)

#将字典转换成元组
dict1 = {'a':100, 'b':42, 'c':9}
tup3 = tuple(dict1)
print(tup3)

#将区间转换成元组
range1 = range(1, 6)
tup4 = tuple(range1)
print(tup4)

#创建空元组
print(tuple())
执行
('h', 'e', 'l', 'l', 'o')
('Python', 'Java', 'C++', 'JavaScript')
('a', 'b', 'c')
(1, 2, 3, 4, 5)
()

Python访问元组元素

1
2
tuplename[index]
indexi 表示索引值。元组的索引可以是正数,也可以是负数。

Python修改元组

1
因为元组为不可变序列,估所以我们只能创建一个新的元组去替代旧的元组。

Python删除元组

1
2
与上同,只能通郭del全部删除
del tuplename

Python dict字典

Python字典(dict)是一种无序的、可变的序列,它的元素以“键值对(key-value)”的形式存储。相对地,列表(list)和元组(tuple)都是有序的序列,它们的元素在底层是挨着存放的。

字典类型是 Python 中唯一的映射类型,映射指的是元素之间相互对应的关系。

习惯将各元素对应的索引称为键(key),各个键对应的元素称为值(value),键及其关联的值称为“键值对”。

主要特征 解释
通过键而不是通过索引来读取元素 字典类型有时也称为关联数组或者散列表(hash)。它是通过键将一系列的值联系起来的,这样就可以通过键从字典中获取指定项,但不能通过索引来获取。
字典是任意数据类型的无序集合 和列表、元组不同,通常会将索引值 0 对应的元素称为第一个元素,而字典中的元素是无序的。
字典是可变的,并且可以任意嵌套 字典可以在原处增长或者缩短(无需生成一个副本),并且它支持任意深度的嵌套,即字典存储的值也可以是列表或其它的字典。
字典中的键必须唯一 字典中,不支持同一个键出现多次,否则只会保留最后一个键值对。
字典中的键必须不可变 字典中每个键值对的键是不可变的,只能使用数字、字符串或者元组,不能使用列表。

Python创建字典

1
2
3
4
5
6
7
8
9
10
11
12
13
#使用 { } 创建字典
dictname = {'key':'value1', 'key2':'value2', ..., 'keyn':valuen}
Point:字典的键可以是整数、字符串或者元组,只要符合唯一和不可变的特性就行;字典的值可以是 Python 支持的任意数据类型。

#通过 fromkeys() 方法创建字典
使用 dict 字典类型提供的 fromkeys() 方法创建带有默认值的字典
dictname = dict.fromkeys(list,value=None)
实例
knowledge = ['语文', '数学', '英语']
scores = dict.fromkeys(knowledge, 100)
print(scores)
执行
{'语文': 100, '数学': 100, '英语': 100}

通过 dict() 映射函数创建字典

创建格式 注意事项
a = dict(str1=value1, str2=value2, str3=value3) str 表示字符串类型的键,value 表示键对应的值。使用此方式创建字典时,字符串不能带引号。
#方式1 demo = [(‘two’,2), (‘one’,1), (‘three’,3)] #方式2 demo = [[‘two’,2], [‘one’,1], [‘three’,3]] #方式3 demo = ((‘two’,2), (‘one’,1), (‘three’,3)) #方式4 demo = ([‘two’,2], [‘one’,1], [‘three’,3]) a = dict(demo) 向 dict() 函数传入列表或元组,而它们中的元素又各自是包含 2 个元素的列表或元组,其中第一个元素作为键,第二个元素作为值。
keys = [‘one’, ‘two’, ‘three’] #还可以是字符串或元组 values = [1, 2, 3] #还可以是字符串或元组 a = dict( zip(keys, values) ) 通过应用 dict() 函数和 zip() 函数,可将前两个列表转换为对应的字典。

Python 访问字典

1
列表和元组是通过下标来访问元素的,而字典不同,它通过键来访问对应的值。因为字典中的元素是无序的,每个元素的位置都不固定,所以字典也不能像列表和元组那样,采用切片的方式一次性访问多个元素。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
#dictname[key] //键必须是存在的,否则会抛出异常。
实例
tup = (['two',26], ['one',88], ['three',100], ['four',-59])
dic = dict(tup)
print(dic['one']) #键存在
print(dic['five']) #键不存在
执行
88
Traceback (most recent call last):
File "C:\Users\mozhiyan\Desktop\demo.py", line 4, in <module>
print(dic['five']) #键不存在
KeyError: 'five'

#Python 更推荐使用 dict 类型提供的 get() 方法来获取指定键对应的值。当指定的键不存在时,get() 方法不会抛出异常。
dictname.get(key[,default])
实例
a = dict(two=0.65, one=88, three=100, four=-59)
print( a.get('one') )
执行
88

Python删除字典

1
2
使用 del 关键字
Python 自带垃圾回收功能,会自动销毁不用的字典,所以一般不需要通过 del 来手动删除。

Python dict字典基本操作(增,删,改:键值对)

由于字典属于可变序列,所以我们可以任意操作字典中的键值对(key-value)。Python 中,常见的字典操作有以下几种:

  • 向现有字典中添加新的键值对。
  • 修改现有字典中的键值对。
  • 从现有字典中删除指定的键值对。
  • 判断现有字典中是否存在指定的键值对。

对键的操作

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
#Python字典添加键值对
dictname[key] = value
实例
a={'math':10000}
print(a)
a['chinese']=10023 //新建一个键,指定一个值
print(a)
执行
{'math': 10000}
{'math': 10000, 'chinese': 10023}

#Python字典修改键值对
实例
a = {'数学': 95, '语文': 89, '英语': 90}
print(a)
a['语文'] = 100 //在原有的值上改变值
print(a)
执行
{'数学': 95, '语文': 89, '英语': 90}
{'数学': 95, '语文': 100, '英语': 90}

#Python字典删除键值对
del语句
实例
a = {'数学': 95, '语文': 89, '英语': 90}
del a['语文']
del a['数学']
print(a)
执行
{'英语': 90}

#判断字典中是否存在指定键值对
print('str/元素' in dictname)

Python使用字典格式化字符串

如果格式化字符串的模板中包含了多个转换说明符,后面就得按照顺序给出多个对应的变量;当字符串模板中只包含少量转换说明符时,这种写法还是比较合适的,但如果字符串模板中包含大量转换说明符,这种按顺序提供变量的方式就有些麻烦了

1
2
3
4
5
6
7
8
9
10
11
12
实例
# 字符串模板中使用key
temp = '教程是:%(name)s, 价格是:%(price).2f, 网址是:%(url)s'
course = {'name':'Python教程', 'price': 9.9, 'url': 'http://c.biancheng.net/python/'}
# 使用字典为字符串模板中的key传入值
print(temp % course)
course = {'name':'C++教程', 'price':15.6, 'url': 'http://c.biancheng.net/cplus/'}
# 使用字典为字符串模板中的key传入值
print(temp % course)
执行
教程是:Python教程, 价格是:9.90, 网址是:http://c.biancheng.net/python/
教程是:C++教程, 价格是:15.60, 网址是:http://c.biancheng.net/cplus/

字典函数补充

keys()、values() 和 items() 方法

将这三个方法放在一起介绍,是因为它们都用来获取字典中的特定数据:

  • keys() 方法用于返回字典中的所有键(key);
  • values() 方法用于返回字典中所有键对应的值(value);
  • items() 用于返回字典中所有的键值对(key-value)。

image-20211109172649585

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
在Python3.x版本返回的类型都不是list类型,因为Python 3.x 不希望用户直接操作这几个方法的返回值。但是2.x版本是返回list类型
若在3.x版本需要更改返回类型:
#使用list()转换成列表
b=list(a.key())

#使用 for in 循环遍历它们的返回值
实例
a = {'数学': 95, '语文': 89, '英语': 90}
for k in a.keys():
print(k,end=' ')
print("\n---------------")
for v in a.values():
print(v,end=' ')
print("\n---------------")
for k,v in a.items():
print("key:",k," value:",v)
执行
数学 语文 英语
---------------
95 89 90
---------------
key: 数学 value: 95
key: 语文 value: 89
key: 英语 value: 90
中间的k,v不可被替换

copy()

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
copy() 方法返回一个字典的拷贝,也即返回一个具有相同键值对的新字典
深浅拷贝
举例
a = {'one': 1, 'two': 2, 'three': [1,2,3]}
b = a.copy()
#向 a 中添加新键值对,由于b已经提前将 a 所有键值对都深拷贝过来,因此 a 添加新键值对,不会影响 b。
a['four']=100
print(a)
print(b)
#由于 b 和 a 共享[1,2,3](浅拷贝),因此移除 a 中列表中的元素,也会影响 b。
a['three'].remove(1)
print(a)
print(b)
执行
{'one': 1, 'two': 2, 'three': [1, 2, 3], 'four': 100}
{'one': 1, 'two': 2, 'three': [1, 2, 3]}
{'one': 1, 'two': 2, 'three': [2, 3], 'four': 100}
{'one': 1, 'two': 2, 'three': [2, 3]}

浅拷贝,指的是重新分配一块内存,创建一个新的对象,但里面的元素是原对象中各个子对象的引用。但是容易出问题。

1
2
3
4
#常见的浅拷贝的方法,是使用数据类型本身的构造器
#对于可变的序列,还可以通过切片操作符“:”来完成浅拷贝
#Python 还提供了对应的函数 copy.copy() 函数,适用于任何数据类型。
注意:对于元组,使用 tuple() 或者切片操作符 ':' 不会创建一份浅拷贝,相反它会返回一个指向相同元组的引用

所谓深拷贝,是指重新分配一块内存,创建一个新的对象,并且将原对象中的元素,以递归的方式,通过创建新的子对象拷贝到新对象中。因此,新对象和原对象没有任何关联。(完全独立,无论怎么变,新拷贝的都不会改变)

1
2
#Python 中以 copy.deepcopy() 来实现对象的深度拷贝。
注意:如果被拷贝对象中存在指向自身的引用,那么程序很容易陷入无限循环。

update()

1
2
3
4
5
6
7
8
使用一个字典所包含的键值对来更新己有的字典;
在执行 update() 方法时,如果被更新的字典中己包含对应的键值对,那么原 value 会被覆盖;如果被更新的字典中不包含对应的键值对,则该键值对被添加进去。
实例
a = {'one': 1, 'two': 2, 'three': 3}
a.update({'one':4.5, 'four': 9.3})
print(a)
执行
{'one': 4.5, 'two': 2, 'three': 3, 'four': 9.3}

pop() 和 popitem() 方法

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
二者都是用来删除字典中的键值对;
不同的是,pop() 用来删除指定的键值对,而 popitem() 用来随机删除一个键值对,它们的语法格式如下:
dictname.pop(key)
dictname.popitem()
实例
a = {'数学': 95, '语文': 89, '英语': 90, '化学': 83, '生物': 98, '物理': 89}
print(a)
a.pop('化学')
print(a)
a.popitem()
print(a)
执行
{'数学': 95, '语文': 89, '英语': 90, '化学': 83, '生物': 98, '物理': 89}
{'数学': 95, '语文': 89, '英语': 90, '生物': 98, '物理': 89}
{'数学': 95, '语文': 89, '英语': 90, '生物': 98}
popitem() 随机删除字典中的一个键值对是不准确的,虽然字典是一种无须的列表,但键值对在底层也是有存储顺序的,popitem() 总是弹出底层中的最后一个 key-value,这和列表的 pop() 方法类似,都实现了数据结构中“出栈”的操作。

setdefault() 方法

1
2
3
setdefault() 方法用来返回某个 key 对应的 value,其语法格式如下:
dictname.setdefault(key, defaultvalue)
当指定的 key 不存在时,setdefault() 会先为这个不存在的 key 设置一个默认的 defaultvalue,然后再返回 defaultvalue。所以总结:

setdefault() 方法总能返回指定 key 对应的 value:

  • 如果该 key 存在,那么直接返回该 key 对应的 value;
  • 如果该 key 不存在,那么先为该 key 设置默认的 defaultvalue,然后再返回该 key 对应的 defaultvalue

Python set集合详解

Python 中的集合,和数学中的集合概念一样,用来保存不重复的元素,即集合中的元素都是唯一的,互不相同。

从形式上看,和字典类似,Python 集合会将所有元素放在一对大括号 {} 中,相邻元素之间用“,”分隔,如下所示:(elementn 表示集合中的元素,个数没有限制。)

1
{element1,element2,...,elementn}

注意!同一集合中,只能存储不可变的数据类型,包括整形、浮点型、字符串、元组,无法存储列表、字典、集合这些可变的数据类型,否则 Python 解释器会抛出 TypeError 错误。

创建set集合

1
2
3
4
5
6
7
#使用 {} 创建
setname = {element1,element2,...,elementn}

#set()函数创建集合
set() 函数为 Python 的内置函数,其功能是将字符串、列表、元组、range 对象等可迭代对象转换成集合。该函数的语法格式如下

setname = set(iteration) //iteration 就表示字符串、列表、元组、range 对象等数据。

访问set元素

1
2
3
4
5
6
7
#最常用循环结构,逐一读取
实例
a = {1,'c',1,(1,2,3)}
for ele in a:
print(ele,end=' ')
执行
1 c (1, 2, 3)

删除set集合

1
#同样的使用del()元素

对set集合操作(基本)

添加元素

1
2
#使用add()函数实现
setname.add(element)

注意:add() 方法添加的元素,只能是数字、字符串、元组或者布尔类型(True 和 False)值,不能添加列表字典集合这类可变的数据,否则 Python 解释器会报 TypeError 错误。

删除元素

1
2
3
4
5
6
7
8
9
10
11
12
#remove(),如果被删除元素本就不包含在集合中,则此方法会抛出 KeyError 错误
#discard(),不会报错,即使元素不在set集合内
setname.remove(element)
实例
a = {1,2,3}
a.remove(1)
print(a)
a.discard(1)
print(a)
执行
{2, 3}
{2, 3}

Python set集合做交集、并集、差集运算

运算操作 Python运算符 含义 例子
交集 & 取两集合公共的元素 >>> set1 & set2 {3}
并集 \ 取两集合全部的元素 >>> set1 \ set2 {1,2,3,4,5}
差集 - 取一个集合中另一集合没有的元素 >>> set1 - set2 {1,2} >>> set2 - set1 {4,5}
对称差集 ^ 取集合 A 和 B 中不属于 A&B 的元素 >>> set1 ^ set2 {1,2,4,5}

set集合函数总结

方法名 语法格式 功能 实例
add() set1.add() 向 set1 集合中添加数字、字符串、元组或者布尔类型 >>> set1 = {1,2,3} >>> set1.add((1,2)) >>> set1 {(1, 2), 1, 2, 3}
clear() set1.clear() 清空 set1 集合中所有元素 >>> set1 = {1,2,3} >>> set1.clear() >>> set1 set() set()才表示空集合,{}表示的是空字典
copy() set2 = set1.copy() 拷贝 set1 集合给 set2 >>> set1 = {1,2,3} >>> set2 = set1.copy() >>> set1.add(4) >>> set1 {1, 2, 3, 4} >>> set1 {1, 2, 3}
difference() set3 = set1.difference(set2) 将 set1 中有而 set2 没有的元素给 set3 >>> set1 = {1,2,3} >>> set2 = {3,4} >>> set3 = set1.difference(set2) >>> set3 {1, 2}
difference_update() set1.difference_update(set2) 从 set1 中删除与 set2 相同的元素 >>> set1 = {1,2,3} >>> set2 = {3,4} >>> set1.difference_update(set2) >>> set1 {1, 2}
discard() set1.discard(elem) 删除 set1 中的 elem 元素 >>> set1 = {1,2,3} >>> set1.discard(2) >>> set1 {1, 3} >>> set1.discard(4) {1, 3}
intersection() set3 = set1.intersection(set2) 取 set1 和 set2 的交集给 set3 >>> set1 = {1,2,3} >>> set2 = {3,4} >>> set3 = set1.intersection(set2) >>> set3 {3}
intersection_update() set1.intersection_update(set2) 取 set1和 set2 的交集,并更新给 set1 >>> set1 = {1,2,3} >>> set2 = {3,4} >>> set1.intersection_update(set2) >>> set1 {3}
isdisjoint() set1.isdisjoint(set2) 判断 set1 和 set2 是否没有交集,有交集返回 False;没有交集返回 True >>> set1 = {1,2,3} >>> set2 = {3,4} >>> set1.isdisjoint(set2) False
issubset() set1.issubset(set2) 判断 set1 是否是 set2 的子集 >>> set1 = {1,2,3} >>> set2 = {1,2} >>> set1.issubset(set2) False
issuperset() set1.issuperset(set2) 判断 set2 是否是 set1 的子集 >>> set1 = {1,2,3} >>> set2 = {1,2} >>> set1.issuperset(set2) True
pop() a = set1.pop() 取 set1 中一个元素,并赋值给 a >>> set1 = {1,2,3} >>> a = set1.pop() >>> set1 {2,3} >>> a 1
remove() set1.remove(elem) 移除 set1 中的 elem 元素 >>> set1 = {1,2,3} >>> set1.remove(2) >>> set1 {1, 3} >>> set1.remove(4) Traceback (most recent call last): File ““, line 1, in set1.remove(4) KeyError: 4
symmetric_difference() set3 = set1.symmetric_difference(set2) 取 set1 和 set2 中互不相同的元素,给 set3 >>> set1 = {1,2,3} >>> set2 = {3,4} >>> set3 = set1.symmetric_difference(set2) >>> set3 {1, 2, 4}
symmetric_difference_update() set1.symmetric_difference_update(set2) 取 set1 和 set2 中互不相同的元素,并更新给 set1 >>> set1 = {1,2,3} >>> set2 = {3,4} >>> set1.symmetric_difference_update(set2) >>> set1 {1, 2, 4}
union() set3 = set1.union(set2) 取 set1 和 set2 的并集,赋给 set3 >>> set1 = {1,2,3} >>> set2 = {3,4} >>> set3=set1.union(set2) >>> set3 {1, 2, 3, 4}
update() set1.update(elem) 添加列表或集合中的元素到 set1

Python frozenset集合

  • set 集合是可变序列,程序可以改变序列中的元素;

  • frozenset 集合是不可变序列,程序不能改变序列中的元素。set 集合中所有能改变集合本身的方法,比如 remove()、discard()、add() 等,frozenset 都不支持;set 集合中不改变集合本身的方法,fronzenset 都支持。

  • frozenset 集合的这些方法和 set 集合中同名方法的功能是一样的。

也就是说,frozenset 集合是set集合的不可变版本。那么什么时候使用f集合呢?

两种情况下可以使用 fronzenset:

  • 当集合的元素不需要改变时,我们可以使用 fronzenset 替代 set,这样更加安全。
  • 有时候程序要求必须是不可变对象,这个时候也要使用 fronzenset 替代 set。比如,字典(dict)的键(key)就要求是不可变对象。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
实例
s = {'Python', 'C', 'C++'}
fs = frozenset(['Java', 'Shell'])
s_sub = {'PHP', 'C#'}
#向set集合中添加frozenset
s.add(fs)
print('s =', s)
#向为set集合添加子set集合
s.add(s_sub)
print('s =', s)
执行
s = {'Python', frozenset({'Java', 'Shell'}), 'C', 'C++'}
Traceback (most recent call last):
File "D:\xxx\xxx\xx\xx.py", line 11, in <module>
s.add(s_sub)
TypeError: unhashable type: 'set'

实例解读

set 集合本身的元素必须是不可变的, 所以 set 的元素不能是 set,只能是 frozenset。代码向 set 中添加 frozenset 是没问题的,因为 frozenset 是不可变的;但是,代码中尝试向 set 中添加子 set,这是不允许的,因为 set 是可变的。

解读字典为何高效

C#学了哈希冲突,没错,就是由基础哈希表改进而来,

  • 对于字典而言,这张表存储了哈希值(hash)、键和值这 3 个元素。
  • 而对集合来说,哈希表内只存储单一的元素。

哈希表插入数据

  • 当向字典中插入数据时,Python 会首先根据键(key)计算出对应的哈希值(通过 hash(key) 函数),而向集合中插入数据时,Python会根据该元素本身计算对应的哈希值(通过 hash(valuse) 函数)。
1
2
3
4
5
6
7
8
实例
dic = {"name":111}
print(hash("name"))
setDemo = {1}
print(hash(1))
执行
8156012332694087136
1

如果哈希表中此位置是空的,那么此元素就可以直接插入其中;反之,如果此位置已被其他元素占用,那么 Python 会比较这两个元素的哈希值和键是否相等:

  • 如果相等,则表明该元素已经存在,再比较他们的值,不相等就进行更新;
  • 如果不相等,这种情况称为哈希冲突(即两个元素的键不同,但求得的哈希值相同)。这种情况下,Python 会使用开放定址法、再哈希法等继续寻找哈希表中空余的位置,直到找到位置。

哈希表查找数据

在哈希表中查找数据,和插入操作类似,Python 会根据哈希值,找到该元素应该存储到哈希表中的位置,然后和该位置的元素比较其哈希值和键(集合直接比较元素值):

  • 如果相等,则证明找到;
  • 反之,则证明当初存储该元素时,遇到了哈希冲突,需要继续使用当初解决哈希冲突的方法进行查找,直到找到该元素或者找到空位为止。

这里的找到空位,表示哈希表中没有存储目标元素。

哈希表删除数据

对于删除操作,Python 会暂时对这个位置的元素赋于一个特殊的值,等到重新调整哈希表的大小时,再将其删除。

需要注意的是,哈希冲突的发生往往会降低字典和集合操作的速度。因此,为了保证其高效性,字典和集合内的哈希表,通常会保证其至少留有 1/3 的剩余空间。随着元素的不停插入,当剩余空间小于 1/3 时,Python 会重新获取更大的内存空间,扩充哈希表,与此同时,表内所有的元素位置都会被重新排放。

虽然哈希冲突和哈希表大小的调整,都会导致速度减缓,但是这种情况发生的次数极少。所以,平均情况下,仍能保证插入、查找和删除的时间复杂度为 O(1)

Python字符串常用方法

Python字符串拼接

1
2
strname = "str1" "str2"   //str'_'为内容
strname = str1+str2 //str'_'为变量

字符串和数字的拼接

是不允许字符串与数字直接拼接,需要将数字类型改编为字符串

1
2
3
4
5
6
7
8
9
10
11
借助 str() 和 repr() 函数将数字转换为字符串,它们的使用格式为:
str(obj)
repr(obj)
实例
name = "C语言中文网"
age = 8
course = 30
info = name + "已经" + str(age) + "岁了,共发布了" + repr(course) + "套教程。"
print(info)
执行
C语言中文网已经8岁了,共发布了30套教程。

str() 和 repr() 函数虽然都可以将数字转换成字符串,但它们之间是有区别的:

  • str() 用于将数据转换成适合人类阅读的字符串形式
  • repr() 用于将数据转换成适合解释器阅读的字符串形式(Python 表达式的形式),适合在开发和调试阶段使用;如果没有等价的语法,则会发生 SyntaxError 异常。

截取字符串

获取单个字符

依靠索引截取需要的字符串。

1
strname[index]

Python 允许从字符串的两端使用索引:(可以作为前面的补充)

  • 当以字符串的左端(字符串的开头)为起点时,索引是从 0 开始计数的;字符串的第一个字符的索引为 0,第二个字符的索引为 1,第三个字符串的索引为 2 ……

  • 当以字符串的右端(字符串的末尾)为起点时,索引是从 -1 开始计数的;字符串的倒数第一个字符的索引为 -1,倒数第二个字符的索引为 -2,倒数第三个字符的索引为 -3 ……

获取多个字符(字符串截去/字符串切片)

1
2
strname[start : end : step]
三个都可以省略,但是每次必须留一个作为参数

len()函数:获取字符串长度或字节数

1
2
3
>>> a='http://c.biancheng.net'
>>> len(a)
22

split():分割字符串

1
2
3
4
str.split(sep,maxsplit)
str:表示要进行分割的字符串;
sep:用于指定分隔符,可以包含多个字符。此参数默认为 None,表示所有空字符,包括空格、换行符“\n”、制表符“\t”等。
maxsplit:可选参数,用于指定分割的次数,最后列表中子串的个数最多为 maxsplit+1。如果不指定或者指定为 -1,则表示分割次数没有限制。

join():合并字符串

1
2
3
4
5
newstr = str.join(iterable)
此方法中各参数的含义如下:
newstr:表示合并后生成的新字符串;
str:用于指定合并时的分隔符;
iterable:做合并操作的源字符串数据,允许以列表、元组等形式提供。

count():统计字符串出现的次数

1
2
3
4
5
6
str.count(sub[,start[,end]])
此方法中,各参数的具体含义如下:
str:表示原字符串;
sub:表示要检索的字符串;
start:指定检索的起始位置,也就是从什么位置开始检测。如果不指定,默认从头开始检索;
end:指定检索的终止位置,如果不指定,则表示一直检索到结尾。

find()方法:检测字符串中是否包含某子串

1
2
3
4
5
6
str.find(sub[,start[,end]])
此格式中各参数的含义如下:
str:表示原字符串;
sub:表示要检索的目标字符串;
start:表示开始检索的起始位置。如果不指定,则默认从头开始检索;
end:表示结束检索的结束位置。如果不指定,则默认一直检索到结尾。

index()方法:检测字符串中是否包含某子串

1
2
3
4
5
6
str.index(sub[,start[,end]])
此格式中各参数的含义分别是:
str:表示原字符串;
sub:表示要检索的子字符串;
start:表示检索开始的起始位置,如果不指定,默认从头开始检索;
end:表示检索的结束位置,如果不指定,默认一直检索到结尾。

ljust()、rjust()和center(),字符串对齐方法

1
输出对齐,皆有参考

startswith()和endswith()检索指定字符串方法,

1
2
3
4
5
6
7
8
9
10
str.startswith(sub[,start[,end]])
此格式中各个参数的具体含义如下:
str:表示原字符串;
sub:要检索的子串;
start:指定检索开始的起始位置索引,如果不指定,则默认从头开始检索;
end:指定检索的结束位置索引,如果不指定,则默认一直检索在结束。

>>> str = "c.biancheng.net"
>>> str.startswith("c")
True
1
2
3
4
5
6
7
8
9
10
str.endswith(sub[,start[,end]])
此格式中各参数的含义如下:
str:表示原字符串;
sub:表示要检索的字符串;
start:指定检索开始时的起始位置索引(字符串第一个字符对应的索引值为 0),如果不指定,默认从头开始检索。
end:指定检索的结束位置索引,如果不指定,默认一直检索到结束。

>>> str = "c.biancheng.net"
>>> str.endswith("net")
True

title()、lower() 和 upper()。大小写转换函数

1
2
3
4
5
6
7
8
9
title() 方法的语法格式如下:
str.title()

>>> str = "c.biancheng.net"
>>> str.title()
'C.Biancheng.Net'
>>> str = "I LIKE C"
>>> str.title()
'I Like C'
1
2
3
4
5
6
lower() 方法的语法格式如下:
str.lower()

>>> str = "I LIKE C"
>>> str.lower()
'i like c'
1
2
3
4
5
6
upper() 方法的语法格式如下:
str.upper()

>>> str = "i like C"
>>> str.upper()
'I LIKE C'

去除字符串中空格的3种方法(删除指定字符)

1
2
3
4
Python 中,字符串变量提供了 3 种方法来删除字符串中多余的空格和特殊字符,它们分别是:
strip():删除字符串前后(左右两侧)的空格或特殊字符。
lstrip():删除字符串前面(左边)的空格或特殊字符。
rstrip():删除字符串后面(右边)的空格或特殊字符。

注意,Python 的 str 是不可变的(不可变的意思是指,字符串一旦形成,它所包含的字符序列就不能发生任何改变),因此这三个方法只是返回字符串前面或后面空白被删除之后的副本,并不会改变字符串本身

1
2
strip() 方法用于删除字符串左右两个的空格和特殊字符,该方法的语法格式为:
str.strip([chars])
1
2
lstrip() 方法用于去掉字符串左侧的空格和特殊字符。该方法的语法格式如下:
str.lstrip([chars])
1
2
rstrip() 方法用于删除字符串右侧的空格和特殊字符,其语法格式为:
str.rstrip([chars])

format()格式化输出

1
2
http://c.biancheng.net/view/4301.html
总的来说,就是统一格式再统一输出,记住参数以及语法即可。

encode()和decode()方法,字符串编码转换

1
2
3
http://c.biancheng.net/view/4305.html
encode() 方法的语法格式如下:
str.encode([encoding="utf-8"][,errors="strict"])
1
2
decode() 方法的语法格式如下:
bytes.decode([encoding="utf-8"][,errors="strict"])

注意,格式中用 [] 括起来的参数为可选参数,也就是说,在使用此方法时,可以使用 [] 中的参数,也可以不使用。

dir()和help()帮助函数

1
2
3
Python dir() 函数用来列出某个类或者某个模块中的全部内容,包括变量、方法、函数和类等,它的用法为:
dir(obj)
obj 表示要查看的对象。obj 可以不写,此时 dir() 会列出当前范围内的变量、方法和定义的类型。
1
help(obj)

Python流程控制

在机房看完了,注意基础编程知识,算法基础等。

image-20211125220645820

Python函数及lambda

终于进入到核心了,加油,不要做无用功。

Python函数(函数定义、函数调用)用法详解

Python函数的定义

point:

1
2
3
def 函数名(参数列表):
//实现特定功能的多行代码
[return [返回值]]

此格式中,各部分参数的含义如下:

  • 函数名:其实就是一个符合 Python 语法的标识符,但不建议读者使用 a、b、c 这类简单的标识符作为函数名,函数名最好能够体现出该函数的功能(如上面的 my_len,即表示我们自定义的 len() 函数)。
  • 形参列表:设置该函数可以接收多少个参数,多个参数之间用逗号( , )分隔。
  • [return [返回值] ]:整体作为函数的可选参参数,用于设置该函数的返回值。也就是说,一个函数,可以用返回值,也可以没有返回值,是否需要根据实际情况而定。

Python函数的调用

1
2
3
[返回值] = 函数名([形参值])

首先,对于调用空函数来说,由于函数本身并不包含任何有价值的执行代码,也没有返回值,应该调用空函数不会有任何效果。

为函数提供说明文档

1
2
3
4
5
6
7
8
9
#定义一个比较字符串大小的函数
def str_max(str1,str2):
'''
比较 2 个字符串的大小
'''
str = str1 if str1 > str2 else str2
return str
help(str_max)
#print(str_max.__doc__)

Python函数值传递和引用传递

穿插一下记录,

操作系统使用到numpy类,是一个开源的python计算库。

https://www.cnblogs.com/lemonbit/p/7043879.html

Python作业记录

1
datetime类(使用replace取消部分数值输出(print),数值仍存在,但是不会影响.second等计算时间差函数使用)
1
2
__init__函数:两个下划线开头的函数是声明该属性为私有,也称之为初始化函数
__init__函数(方法)的第一个参数必须为self,后续参数为自己定义。

Python是面向对象,也是动态语言,可以定义对象

Python类和对象

面向对象

面向对象编程(Object-oriented Programming,简称 OOP),是一种封装代码的方法。封装代码有很多种方法,把常用的功能写成函数,仅仅留一个接口供调用,这也是一种封装,把数据丢入列表也是。只不过,这次的封装,更加高级。

面向对象相关术语(相当基础也很重要,这里我已经有点忘记对象的定义了,这里介绍真的好棒,对于我这种代码呆c来说真的很有帮助)

在系统学习面向对象编程之前,初学者要了解有关面向对象的一些术语。当和其他人讨论代码的时候,或者尝试查找我们遇到的问题的解决方案时,知道正确的术语会很有帮助。

面向对象中,常用术语包括:

  • :可以理解是一个模板,通过它可以创建出无数个具体实例。比如,前面编写的 tortoise 表示的只是乌龟这个物种,通过它可以创建出无数个实例来代表各种不同特征的乌龟(这一过程又称为类的实例化)。
  • 对象类并不能直接使用,通过类创建出的实例(又称对象)才能使用](http://c.biancheng.net/view/4512.html))。这有点像汽车图纸和汽车的关系,图纸本身(类)并不能为人们使用,通过图纸创建出的一辆辆车(对象)才能使用。
  • 属性:类中的所有变量称为属性。例如,tortoise 这个类中,bodyColor、footNum、weight、hasShell 都是这个类拥有的属性。
  • 方法:类中的所有函数通常称为方法。不过,和函数所有不同的是,类方法至少要包含一个 self 参数(后续会做详细介绍)。例如,tortoise 类中,crawl()、eat()、sleep()、protect() 都是这个类所拥有的方法,类方法无法单独使用,只能和类的对象一起使用。

python定义类](http://c.biancheng.net/view/4519.html))

  • 制作图纸,再通过图纸制造出来的物品(也就是实例对象才可使用)

  • 类属性指的就是包含在类中的变量;而类方法指的是包含类中的函数*:类属性和类方法其实分别是包含类中的变量和函数的别称**

  • 同属一个类的所有类属性和类方法,要保持统一的缩进格式,通常统一缩进 4 个空格(tab)

关键字class用来表示类的操作:

1
2
3
4
5
6
class classname:	 //起名注意代码可读性,这我一直都是按照简写
def 属性:
def 方法:
注意,属性与方法对于类来说,可有可无,其次是属性与方法并无先后关系。
class null: //创建空类
pass

Python init()类构造方法类构造方法 (biancheng.net)](http://c.biancheng.net/view/4533.html))

  • 在创建类时,我们可以手动添加一个 init() 方法,该方法是一个特殊的类实例方法,称为构造方法(或构造函数)

    1
    2
    def __init__(self,...):		//两个下划线开头的函数是声明该属性为私有
    代码块
  • init() 方法可以包含多个参数,但必须包含一个名为 self 的参数(通常会直接给出),且必须作为第一个参数self ,self不需要手动传递参数。

  • 创建一个对象

    1
    2
    3
    4
    5
    class tfd():
    def __init__(self,...):

    #顶头写
    对象name = tfd() //创建一个属于tfd()的对象

Python类对象的创建和使用

  • 创建类对象的过程,又称为类的实例化。也就是可以使用的事物

  • 定义类时,如果没有手动添加 init() 构造方法,又或者添加的 init() 中仅有一个 self 参数,则创建类对象时的参数可以省略不写。

  • 类变量(类属性):位于类内,不位于类方法内;实例变量(~属性):定义在类方法内

  • ```
    实例化后的类对象可以执行以下操作:
    访问或修改类对象具有的实例变量,甚至可以添加新的实例变量或者删除已有的实例变量;
    调用类对象的方法,包括调用现有的方法,以及给类对象动态添加方法。

    1
    2

    - python类对象的使用(作用):

    对象name.变量名 //可以添加一个变量
    对象name.一个全新的变量 //就是添加给类对象添加一个变量了
    del 对象name.一个全新的变量 //就是删除刚刚动态添加的变量
    对象name.方法名(参数)

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33

    实例:

    ```python
    class CLanguage :
    # 下面定义了2个类变量,可有可无,因为下面还是手动输一次
    name = "C语言中文网"
    add = "http://c.biancheng.net"
    def __init__(self,name,add):
    #下面定义 2 个实例变量
    self.name = name
    self.add = add
    print(name,add)
    # 下面定义了一个say实例方法,没啥难理解的,也就是说出你刚刚输入的话罢了
    def say(self, content):
    print(content)
    # 将该CLanguage对象赋给clanguage变量
    clanguage = CLanguage("C语言中文网","http://c.biancheng.net")
    #输出name和add实例变量的值
    print(clanguage.name,clanguage.add)
    #修改实例变量的值
    clanguage.name="Python教程"
    clanguage.add="http://c.biancheng.net/python"
    #调用clanguage的say()方法
    clanguage.say("人生苦短,我用Python")
    #再次输出name和add的值
    print(clanguage.name,clanguage.add)

    输出:
    C语言中文网 http://c.biancheng.net
    C语言中文网 http://c.biancheng.net
    人生苦短,我用Python
    Python教程 http://c.biancheng.net/python

2022/4/10,工具找的差不多了,其实这也是我给我自己不想学语言找的理由,我其实想当医生,我个人认为我在医学上会有一番建树,无奈考试落榜,对于代码,有点看不懂,但是我认为还有一些因素,我还不确定,我这次会努力点不变成代码白痴,多练习!

继续学习,尽量不浪费太多时间在做笔记上,那些记下来也会忘记,再想看我也不会来博客看,所以做笔记我打算要以自己的总结为主,纠正我之前的错误。

目标:自己写脚本,看得懂别人的脚本

突然想去直接看学习总结,或许是更快的方法,我觉得还不错,现在去看看爬虫怎么写,用一下scrapy写

爬虫Scrapy

最好在python目录的script下

1
pip install scrapy

然后桌面命令行

1
scrapy startproject wikispider

就可以创建一个爬虫的根文件夹了

image-20220410122502374

然后去setting.py改一下你需要的配置,然后cmd走一波命令,或者自己调试一下在pycharm也可跑

PTA刷题

由于leecode有点难,我跑去pta刷题了,但是没有权限,只可以看题目,不过也够了,争取刷快点吧,因为哪怕上面记得再多也不是我的, 我基本没有实战过写过,所以还得是刷题

.split():以空格为分隔符,输入的时候可以分,输出也可分!

sum

range

.format()函数:规范输出,指明输出值https://m.php.cn/article/471817.html

很神奇,多打打

1
2
3
4
5
x=float(input())
if(x==0):
print("f(%.1f) = %.1f"%(x,x))
else:
print("f(%.1f) = %.1f"%(x,1/x))

int()函数:int(a*i)=9+i位本身=99(i=1),怎么说呢,a+aa+aaa,就是靠这个实现

  • 第2章-4 特殊a串数列求和 (20 分)

    1
    2
    3
    4
    5
    a,n=input().split() #连续输入,间隔为一个空格
    n,s=int(n),0 #s=0,n必须这么写,不然range识别不到
    for i in range(1,n+1): #range(9)=默认0-9
    s=s+int(a*i)
    print("sum = %d"%s)

map函数

第2章-7 产生每位数字相同的n位数 (30 分)

  • a,b=input().split(',')#也可写 a,b=map(int,input().split(','))
    a,b=int(a),int(b)
    print(str(a)*b)
    

eval函数:https://blog.csdn.net/chen_zan_yu_/article/details/103339750


本博客所有文章除特别声明外,均采用CC BY-SA 4.0 协议 ,转载请注明出处!

...

...

00:00
00:00