1、提示注释,只提示,不强制结果
def fun1(a:int,b:str="default1")->str:
return a*b
print(fun1(2,"ab")) #abab #字符串重复
print(fun1(3)) #default1default1default1 #字符串重复
print(fun1(3,2)) #6 注意:结果不为str格式,两数字相乘结果还为数字
2、min(...,key...)
H1, H2, H3, H4 = map(int, input().split()) #输入 150 165 135 133
取出key中最小值x,其中x为H2, H3, H4中的一个
分析:比较(15,165)、(15,135)、(17,133)
元组比较规则:先比第一个元素,相同再比第二个
print(min(H2, H3, H4, key=lambda x: (abs(x - H1), x))) # 135
补充:key 常见于 sorted、list.sort、min、max
3、时间复杂度和空间复杂度的判断
时间复杂度:数循环执行次数,用 n 表示,去掉的是"常数系数"和"低阶项"。
例如:
循环 n-1 ------时间复杂度为O(n)
3n + 5 → O(n)(3 和 5 都去掉)
n² + 3n + 10 → O(n²)(只留最高阶)
空间复杂度:存储空间例如:
用了长度为 n+1 的数组/列表------空间复杂度为O(n)
只用了几个变量(a, b, i 之类)→ O(1)(常数级)
4、拷贝
(1)b=a.copy()浅拷贝,修改共享列表时,b和a共用一个数据;但要是赋新列表,不共用
示例1:
a = {1: 2, 3: 4}
b = a.copy() # b复制a
b1.append(3) # b1=2,3 ∵浅拷贝,∴a1=b1
print(a1) # a1=2,3
示例2:a = {1: 2}
b = a.copy()
b1 = 99 # 注意:∵b1 赋新列表,而不是b1.append,∴b1不影响a1
print(a1) # a1不受影响!
b1.append(3) # b1修改共享的列表,b1会影响a1,b1=2,3
print(a1) # b1=a1=2, 3
(2)b=copy.deepcopy(a)深拷贝,b和a数据独立,互不影响
示例3:
import copy
a = {1: 2, 3: 4}
b = copy.deepcopy(a) # 深拷贝
b1.append(3) # b1=2,3
print(a1) # a1=2 ← b不影响a
(3)切片,浅拷贝
a = 1, 2, \[3, 4]
b = a: # 切片,浅拷贝
b0 = 10 # 修改外层元素,不影响a
b20 = 30 # 修改内层列表,影响a
print(a) # 1, 2, \[30, 4]
(4)例题
执行以下Python代码后,输出结果是 (1, 2, 3) 。( ❌️ )
a = 1, 2
b = (a, 3)
a.append(4)
print(b) #
([1, 2, 4], 3)
分析:b = (a, 3) # 第 1 个元素是
a(列表的引用)b里存的不是列表的拷贝,而是 a 这个列表本身 。
b ──→ ( ●, 3 )
│
└──→ a 指向的同一个列表 1, 2
5、嵌套列表推导式的理解
列表推导式的多个 for 是从左到右嵌套:先写的外层,后写的内层。
result=item for row in matrix for item in row # 外层 内层
等价于
for row in matrix: # 外层:遍历每一行
for item in row: # 内层:遍历这一行里的每个元素
result.append(item)
6、默认参数的可变对象陷阱
def func(x, lst=\[\]): # 陷阱1:默认参数,列表只创建一次,之后一直复用
lst.append(x)
return lst
print(func(1), func(2), func(3)) # 陷阱2:1, 2, 3 1, 2, 3 1, 2, 3
分析陷阱2:
func(1):返回1
func(2):返回1,2
func(3):返回1,2,3
但是print返回当前状态,当前lst已为1,2,3,∴最终结果为1, 2, 3 1, 2, 3 1, 2, 3
7、finally与return运行的顺序
try和finally都有return 时,finally赢。
finally永远执行,且优先于return生效。
finally里若有return,会覆盖前面try的返回值。
try无return,正常执行finally,函数返回None【注意】。
示例1:
def f():
try:
return "From try"
finally:
print("From finally", end="#")
print(f(), end="#") # From finally#From try#
示例2:def f():
try:
return "From try"
finally:
return "From finally" # 会覆盖 try 的 return!
print(f()) # From finally
示例3:def f():
try:
print("try", end="#")
finally:
print("finally", end="#")
print(f(), end="#") # try#finally#None#
8、修改全局变量和外层函数变量的关键字
在嵌套函数中,需要修改外层函数(非全局作用域)的变量,用nonlocal关键字。
修改全局变量,用global关键字。
9、lambda 匿名函数可以接受多个参数,但只能有一个表达式。
10、元组解包赋值:先算右边所有值,再同时赋给左边。


11、readline和readline
在Python中, readline() 方法每次读取文件的下一行内容,包括行尾的换行符。如果已到文件末尾,则返回一个空字符串。readlines()返回列表。