组队学习专用——chap 3

目录

一、个人链接主页

https://hydro.ac/d/datawhale_p2s/user/63162

二、变量

三、保留字

四、元组、解包

1.元组

2.元组解包

五、Helper Fuctions


一、个人链接主页

登录 - HydroOJ

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])

你觉得输出结果是什么?

  1. {'name': 'Jack', 'id': 0}
  2. {'name': 'Pony', 'id': 1}
  3. {'name': 'Crossin', 'id': 2}
  4. {'name': 'Pony', 'id': 2}
  5. {'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. 当你给一个变量重新赋值之后,它就不再是之前的那个变量,所有的操作不会再影响到之前的变量上
  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库跑一遍!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值