GESP Python笔记

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()返回列表。

相关推荐
wzdark1 小时前
算法中的记忆化思想与重复子问题优化4
算法
Discipline10292 小时前
流水线运行是否正随时间变得更加集中?
算法
半日闲dusknook2 小时前
我给 AI 写了个「音频编译器」:把「听起来还行」变成 PASS/FAIL
python
周玉奎先生2 小时前
CGM系列水泥基灌浆料型号参数解析及安庆重点工程应用匹配
经验分享·笔记·零售
海海不掉头发2 小时前
软件项目管理学习笔记-从软件危机到敏捷与DevOps
笔记·学习·devops
在世修行2 小时前
干货:信号槽
python·信号槽
Wx-bishekaifayuan2 小时前
springboot生活易购超市管理系统54086-计算机课程设计、毕业设计
spring boot·后端·python·django·课程设计·express·旅游
lzhdim2 小时前
C#不为人知的10个魔法特性:资深开发者也会震惊的底层奥秘
java·前端·javascript·算法·c#
weixin_307779132 小时前
C++代码实现MATLAB中的pade函数功能
开发语言·c++·算法·matlab