目录
https://hydro.ac/d/datawhale_p2s/user/63162
一、个人链接主页
https://hydro.ac/d/datawhale_p2s/user/63162
二、变量
在学习Python 的过程中,有一个 bug,出现的频率非常高,经常有人会踩坑:
person = {'name': '', 'id': 0}
team = []
for i in range(3):
x = person
x['id'] = i
team.append(x)
team[0]['name'] = 'Jack'
team[1]['name'] = 'Pony'
team[2]['name'] = 'Crossin'
print(team[1])
你觉得输出结果是什么?
- {'name': 'Jack', 'id': 0}
- {'name': 'Pony', 'id': 1}
- {'name': 'Crossin', 'id': 2}
- {'name': 'Pony', 'id': 2}
- {'name': 'Crossin', 'id': 1}
一种很常见的错误,就是觉得 team 这里列表(list)里是三个独立的字典(dict)对象。然而看了输出你就会发现,列表中的三个元素长得一样。而且,如果你之后再更改任何一个的 name 或 id 属性,另外两个也会跟着变。
在 Python 中,要把变量想象成一个标签,而不是一个容器!在某些语言中,变量确实像一个“容器”,你定义了某种类型的变量,就给你分配好这个容器,之后你给变量赋值,就像是往容器里装入不同的内容,但容器还是那个容器,不会变。你创建3个容器,赋给一样的值,他们也还是3个独立的容器。
但在 Python 中,这个理解是错误的!Python 中的变量像是一个“标签”,你给一个变量赋值,就是把这个标签贴在一个对象上;重新赋值,就是撕下标签帖到另一个对象上。给3个变量赋给一样的值,就相当于把3个标签贴在同一个对象上。
用一个简单的例子来说明:
a = 1
b = 2
c = 1
# 再次赋值
a = b
通过输出 id(相当于内存地址)也可以说明这点:
在赋值之后,其实并不是 a 的值发生了变化,而是 a 的地址发生了变化。
理解了这点之后,就会明白2件事:
- 当你给一个变量重新赋值之后,它就不再是之前的那个变量,所有的操作不会再影响到之前的变量上
- 当你给多个变量赋值相同的变量,它们其实都是同一个,只要改动其中之一,其他的也会跟着变化。(注意,是改动而非重新赋值,比如修改对象属性)
三、保留字
保留字可以用以下方法调出:
四、元组、解包
1.元组
Python 使用逗号(,),而不是括号(())定义元组。例如,以下代码定义了一个包含两个元素的元组:
1,2
同时,括号可以使得元组更加清晰:
(1, 2)
Python 使用括号创建空元组:
()
另外,我们也可以使用 tuple() 构造函数创建元组。例如:
tuple()
即使元组只包含一个元素,定义时也需要使用逗号。以下示例创建了一个单元素的元组:
1,
它和下面的定义作用相同:
(1, )
下面的代码定义了一个整数,而不是元组:
(1)
2.元组解包
元组解包就是将元组的元素拆分给不同的变量。例如:
x, y = (1, 2)
使用传统方法交换两个变量的值需要定义一个临时变量,例如:
x = 10
y = 20
print(f'x={x}, y={y}')
tmp = x
x = y
y = tmp
print(f'x={x}, y={y}')
而在 Python,我们可以利用元组解包实现相同的结果:
x = 10
y = 20
print(f'x={x}, y={y}')
x, y = y, x
print(f'x={x}, y={y}')
某些情况下,我们并不需要解包元组中的所有元素。例如,我们可能只需要解包前两个元素。这种情况下,可以使用 * 运算符。例如:
r, g, *other = (192, 210, 100, 0.5)
输出结果如下:
192
210
[100, 0.5]
五、Helper Fuctions
Helper Functions(辅助函数)是用于简化和重用代码的小函数。它们通常执行特定的任务,能够提高代码的可读性、可维护性和组织性。
比如举一些经常会用到的:
def clean_string(s):
"""去除字符串的首尾空格并转换为小写"""
return s.strip().lower()
def is_valid_email(email):
"""检查电子邮件格式是否有效"""
import re
pattern = r'^[\w\.-]+@[\w\.-]+\.\w+$'
return re.match(pattern, email) is not None
import random
def get_random_int(min_val, max_val):
"""生成指定范围内的随机整数"""
return random.randint(min_val, max_val)
def read_file(file_path):
"""读取文件并返回内容"""
with open(file_path, 'r') as file:
return file.read()
def unique_list(lst):
"""返回去重后的列表"""
return list(set(lst))
import time
def delayed_execution(func, delay):
"""延迟执行指定函数"""
time.sleep(delay)
return func()
ps:time这个库在绘制七段晶体管时非常有用,有兴趣的同学可以用turtle库跑一遍!