3173 lines
71 KiB
Markdown
3173 lines
71 KiB
Markdown
# Python学习笔记
|
||
|
||
## Day 1: Python基础入门
|
||
|
||
### 1.1 开发环境配置
|
||
- 安装VSCode编辑器
|
||
- 安装Python插件
|
||
- 创建第一个.py文件
|
||
|
||
### 1.2 第一个Python程序
|
||
```python
|
||
print('hello world')
|
||
print(1+2+3)
|
||
```
|
||
|
||
### 1.3 print函数详解
|
||
- print函数用于输出内容到终端
|
||
- 默认情况下,print函数输出的内容会自动换行
|
||
- 使用end参数可以控制输出格式:
|
||
```python
|
||
# 默认换行输出
|
||
print(1)
|
||
print(2)
|
||
print(3)
|
||
|
||
# 使用end参数自定义分隔符
|
||
print(1, end='---')
|
||
print(2, end='---')
|
||
print(3, end='---')
|
||
|
||
# 使用逗号分隔输出
|
||
print('你好', end=',')
|
||
print('世界')
|
||
```
|
||
|
||
### 1.4 字面量和常量
|
||
- **字面量**:程序中直接使用的固定值
|
||
- 数字字面量:如 `3.14`
|
||
- 字符串字面量:如 `'hello'`
|
||
- **常量**:
|
||
- 给特定值取一个名字
|
||
- 命名约定使用大写字母
|
||
- 值不应该被修改
|
||
```python
|
||
PI = 3.14
|
||
print(PI)
|
||
```
|
||
- **变量**:
|
||
- 给特定值取一个名字
|
||
- 值可以随时修改
|
||
```python
|
||
name = 'zhangsan'
|
||
name = '张三'
|
||
print(name)
|
||
```
|
||
|
||
### 1.5 注释
|
||
- **注释的作用**:对代码进行解释说明,供程序员阅读
|
||
- **注释的类型**:
|
||
1. 单行注释:以 `#` 开头
|
||
```python
|
||
# 这里是一个常量
|
||
COUNT = 100
|
||
```
|
||
2. 多行注释:使用三引号 `"""` 或 `'''`
|
||
```python
|
||
"""
|
||
a变量的值是1
|
||
b变量的值是2
|
||
c变量的值是3
|
||
"""
|
||
a = 1
|
||
b = 2
|
||
c = 3
|
||
```
|
||
|
||
### 1. if语句的梳理
|
||
```python
|
||
# if语句 单分支
|
||
num = -10
|
||
if num > 0:
|
||
print('num是正数')
|
||
|
||
# if else语句 双分支
|
||
age = int(input('请输入你的年龄'))
|
||
if age>=18:
|
||
print('成年人')
|
||
else:
|
||
print('没有成年')
|
||
|
||
# elif语句 多分支
|
||
num = int(input('请输入一个数字'))
|
||
if num>0:
|
||
print('正数')
|
||
elif num<0:
|
||
print('负数')
|
||
else:
|
||
print('等于0')
|
||
```
|
||
|
||
## Day 2: 字符串与输入输出
|
||
|
||
### 2.1 字符串操作
|
||
- 字符串拼接:`+` 号
|
||
- 字符串重复:`*` 号
|
||
- 成员运算:`in` / `not in`
|
||
- 索引取值:`str[i]`
|
||
- 负数索引:`str[-1]` 表示最后一个字符
|
||
|
||
示例代码:
|
||
```python
|
||
s1 = '我的名字是'
|
||
s2 = '佳佳'
|
||
print(s1 + s2)
|
||
|
||
name = '张三'
|
||
print('我的名字是' + name)
|
||
|
||
str1 = '我要成功'
|
||
print(str1 * 5)
|
||
|
||
str2 = 'my name is zhangsan'
|
||
print('y' in str2)
|
||
print('yy' in str2)
|
||
print('name' in str2)
|
||
|
||
str3 = 'zhangsan'
|
||
print('san' not in str3)
|
||
print('lisi' not in str3)
|
||
|
||
str4 = '你好世界'
|
||
print(str4[0], str4[1], str4[2], str4[3])
|
||
print(str4[0] + str4[2] + str4[-1])
|
||
```
|
||
|
||
### 2.2 输入与输出
|
||
- `input()` 用于获取用户输入,返回字符串类型
|
||
- `print()` 用于输出内容
|
||
|
||
示例代码:
|
||
```python
|
||
name = input('请输入你的名字')
|
||
print('你输入的内容是' + name)
|
||
|
||
n1 = input('请输入第一个数字')
|
||
n2 = input('请输入第二个数字')
|
||
print(n1 + n2) # 字符串拼接
|
||
|
||
# 转换为整数再相加
|
||
n1 = int(input('请输入第一个数字'))
|
||
n2 = int(input('请输入第二个数字'))
|
||
print(n1 + n2)
|
||
```
|
||
|
||
### 2.3 数据类型检测与转换
|
||
- `type()` 检测数据类型
|
||
- `int()`、`float()`、`str()` 类型转换
|
||
|
||
示例代码:
|
||
```python
|
||
n1 = input('请输入一个数字')
|
||
print(type(n1)) # str
|
||
print(type(int(n1))) # int
|
||
|
||
n1 = input('请输入第一个数字')
|
||
n2 = input('请输入第二个数字')
|
||
n1 = int(n1)
|
||
n2 = int(n2)
|
||
print(n1 + n2)
|
||
print(n1 - n2)
|
||
print(n1 * n2)
|
||
print(n1 / n2)
|
||
```
|
||
|
||
### 2.4 变量与数据类型基础
|
||
- Python变量无需声明类型,类型由赋值自动推导
|
||
- 常见类型:int、float、str、bool
|
||
|
||
### 2.5 列表的基本操作
|
||
- 创建、添加、访问、获取长度
|
||
|
||
示例代码:
|
||
```python
|
||
fruits = ["apple", "banana", "cherry"]
|
||
fruits.append("orange")
|
||
first_fruit = fruits[0]
|
||
num_fruits = len(fruits)
|
||
```
|
||
|
||
## Day 3: 运算符与变量
|
||
|
||
### 3.1 数据类型转换函数
|
||
- `int(x)`:将x转为整数
|
||
- `float(x)`:将x转为浮点数
|
||
- `str(x)`:将x转为字符串
|
||
- 布尔值、浮点数、字符串之间的转换
|
||
|
||
示例代码:
|
||
```python
|
||
print(int('100')) # 100
|
||
print(int(True)) # 1
|
||
print(int(3.14)) # 3
|
||
print(float(100)) # 100.0
|
||
print(str(True)) # 'True'
|
||
```
|
||
|
||
### 3.2 算术运算符
|
||
- `+` 加法
|
||
- `-` 减法
|
||
- `*` 乘法
|
||
- `/` 除法
|
||
- `//` 取整除
|
||
- `%` 取余
|
||
- `**` 幂运算
|
||
|
||
示例代码:
|
||
```python
|
||
print(1 + 2) # 3
|
||
print(7 - 9) # -2
|
||
print(2 * 3) # 6
|
||
print(8 / 3) # 2.666...
|
||
print(9 // 2) # 4
|
||
print(9 % 2) # 1
|
||
print(2 ** 3) # 8
|
||
|
||
# 布尔值参与运算
|
||
print(True + True) # 2
|
||
print(True - True) # 0
|
||
print(True * True) # 1
|
||
print(True / True) # 1.0
|
||
```
|
||
|
||
### 3.3 赋值运算符
|
||
- `=` 赋值,将右边的值赋给左边变量
|
||
|
||
示例代码:
|
||
```python
|
||
a = 100
|
||
a = a + 2
|
||
print(a) # 102
|
||
num = 10
|
||
num = num + num + num + 100
|
||
print(num) # 130
|
||
```
|
||
|
||
### 3.4 复合赋值运算符
|
||
- `+=`、`-=`、`*=`、`/=`、`//=`、`%=`、`**=`
|
||
|
||
示例代码:
|
||
```python
|
||
a = 1
|
||
a += 1
|
||
print(a) # 2
|
||
|
||
a = 1
|
||
b = 2
|
||
c = 3
|
||
a += b
|
||
a -= c
|
||
b += c
|
||
c += b
|
||
print(a, b, c) # 0 5 8
|
||
```
|
||
|
||
### 3.5 内置的数字运算函数
|
||
- `abs(x)`:绝对值
|
||
- `divmod(x, y)`:返回(x//y, x%y)
|
||
- `pow(x, y, z=None)`:幂运算,可取模
|
||
- `round(x, n=0)`:四舍五入,保留n位小数
|
||
- `max(x1, x2, ...)`:最大值
|
||
- `min(x1, x2, ...)`:最小值
|
||
|
||
示例代码:
|
||
```python
|
||
print(abs(-100)) # 100
|
||
print(divmod(9, 2)) # (4, 1)
|
||
print(pow(2, 3)) # 8
|
||
print(round(3.6678, 3)) # 3.668
|
||
print(max(23, 45, 67, 89)) # 89
|
||
print(min(23, 45, 67, 89)) # 23
|
||
```
|
||
|
||
### 3.6 变量
|
||
- 变量就像盒子,可以存放内容
|
||
- 变量声明格式:变量名 = 值
|
||
- 变量的值可以改变
|
||
- 变量名要有语义
|
||
|
||
示例代码:
|
||
```python
|
||
name = 'zhangsan'
|
||
age = 18
|
||
sex = '男'
|
||
grade = 'IT231'
|
||
print(name, age, sex, grade)
|
||
```
|
||
|
||
## Day 4: 变量命名与字符串格式化
|
||
|
||
### 4.1 变量命名规则与标识符
|
||
- 变量名只能包含字母、数字和下划线,不能以数字开头
|
||
- 不能使用Python关键字和函数名
|
||
- 变量名应简短且有描述性
|
||
- 标识符区分大小写,不能是关键字或保留字
|
||
|
||
### 4.2 字符串的定义与嵌套
|
||
- 单引号、双引号、三引号均可定义字符串
|
||
- 三引号支持多行字符串
|
||
- 引号可嵌套使用
|
||
|
||
### 4.3 字符串拼接与格式化
|
||
- `+` 号拼接字符串
|
||
- `%` 占位符格式化字符串(%s, %d, %f)
|
||
- `f"{}"` 格式化字符串(推荐)
|
||
|
||
示例代码:
|
||
```python
|
||
name = '张三'
|
||
age = 18
|
||
gender = '男'
|
||
print('我的名字是' + name + ',我今年' + str(age) + '岁,我是' + gender + '的')
|
||
print('我的名字是%s,我今年%s岁,我是%s的' % (name, age, gender))
|
||
print(f'我的名字是{name},我今年{age}岁,我是{gender}的')
|
||
```
|
||
|
||
### 4.4 字符串格式化表达式
|
||
```python
|
||
print("1 * 1的结果是:%d" % (1 * 1))
|
||
print(f"1 * 2的结果是:{1 * 2}")
|
||
print("字符串在Python中的类型名是:", type("字符串"))
|
||
```
|
||
|
||
### 4.5 变量交换与小数处理
|
||
- 不用第三变量交换两个数
|
||
- 保留小数位(不四舍五入)
|
||
|
||
示例代码:
|
||
```python
|
||
# 保留两位小数(不四舍五入)
|
||
origin = 123.456789
|
||
print(int(origin * 100) / 100) # 123.45
|
||
|
||
# 交换变量
|
||
a = 5
|
||
b = 8
|
||
a = a + b
|
||
b = a - b
|
||
a = a - b
|
||
print(a, b) # 8 5
|
||
```
|
||
|
||
### 4.6 综合练习
|
||
- 计算小时转天和小时
|
||
- 输入两个数字,输出和、差、积、商、余数
|
||
|
||
示例代码:
|
||
```python
|
||
# 小时转天和小时
|
||
hours = 89
|
||
day = int(hours / 24)
|
||
h = hours % 24
|
||
print('为抵抗洪水,战士连续作战89小时,编程计算共' + str(day) + '天零' + str(h) + '小时')
|
||
|
||
# 输入两个数字,输出运算结果
|
||
x = float(input("请输入第一个数字 x: "))
|
||
y = float(input("请输入第二个数字 y: "))
|
||
print(f"{x} + {y} = {x + y}")
|
||
print(f"{x} - {y} = {x - y}")
|
||
print(f"{x} * {y} = {x * y}")
|
||
print(f"{x} / {y} = {x / y}")
|
||
print(f"{x} % {y} = {x % y}")
|
||
```
|
||
|
||
## Day 5: 条件判断与分支结构
|
||
|
||
### 5.1 条件测试与比较运算符
|
||
- `==` 等于
|
||
- `!=` 不等于
|
||
- `>` 大于
|
||
- `<` 小于
|
||
- `>=` 大于等于
|
||
- `<=` 小于等于
|
||
- `and` 多条件同时满足
|
||
- `or` 多条件有一个满足
|
||
- `in` 检查成员
|
||
- `not in` 检查非成员
|
||
|
||
示例代码:
|
||
```python
|
||
n1 = 10
|
||
n2 = 10
|
||
n3 = 20
|
||
print(n1 == n2) # True
|
||
print(n1 != n3) # True
|
||
|
||
str1 = 'hello'
|
||
str2 = 'Hello'
|
||
print(str1 == str2.lower()) # True
|
||
|
||
print(5 == 5 and 10 != 5) # True
|
||
print(5 != 10 or 10 == 15) # True
|
||
|
||
print('e' in 'hello') # True
|
||
print('he' not in 'hello') # False
|
||
```
|
||
|
||
### 5.2 程序的三大结构
|
||
- 顺序结构
|
||
- 选择结构(分支)
|
||
- 循环结构
|
||
|
||
### 5.3 if语句
|
||
- 单分支
|
||
- 双分支
|
||
- 多分支(elif)
|
||
|
||
示例代码:
|
||
```python
|
||
# 单分支
|
||
n1 = -10
|
||
if n1 > 0:
|
||
print('这个是正数')
|
||
|
||
# 双分支
|
||
age = 10
|
||
if age >= 18:
|
||
print('成年了')
|
||
else:
|
||
print('没有成年')
|
||
|
||
# 多分支
|
||
num = int(input("请输入一个整数: "))
|
||
if num > 0:
|
||
print("这个数是正数")
|
||
elif num < 0:
|
||
print("这个数是负数")
|
||
else:
|
||
print("这个数是零")
|
||
```
|
||
|
||
### 5.4 综合练习与应用
|
||
- 判断闰年
|
||
- 补零输出
|
||
- 判断奇偶数
|
||
- 判断字符类型
|
||
- 判断水仙花数
|
||
- 密码判断
|
||
|
||
示例代码:
|
||
```python
|
||
# 判断闰年
|
||
year = int(input('请输入一个年份:'))
|
||
if (year % 4 == 0 and year % 100 != 0) or (year % 400 == 0):
|
||
print(f"{year} 是闰年")
|
||
else:
|
||
print(f"{year} 不是闰年")
|
||
|
||
# 补零输出
|
||
num = int(input('请输入一个数字:'))
|
||
if num < 10:
|
||
print(f"0{num}")
|
||
else:
|
||
print(num)
|
||
|
||
# 判断奇偶数
|
||
num = int(input("请输入一个整数: "))
|
||
if num % 2 == 0:
|
||
print("这个数是偶数")
|
||
else:
|
||
print("这个数是奇数")
|
||
|
||
# 判断水仙花数
|
||
num = int(input('请输入一个三位的数字:'))
|
||
a = num % 10
|
||
b = num % 100 // 10
|
||
c = num // 100
|
||
if a**3 + b**3 + c**3 == num:
|
||
print(f'你输入的三位数{num}是水仙花数')
|
||
else:
|
||
print(f'你输入的三位数{num}不是水仙花数')
|
||
|
||
# 密码判断
|
||
correct_password = "python123"
|
||
password = input("请输入密码: ")
|
||
if password == correct_password:
|
||
print("密码正确,欢迎进入系统!")
|
||
else:
|
||
print("密码错误,请重试。")
|
||
```
|
||
|
||
## Day 6: 多分支与综合练习
|
||
|
||
### 6.1 多分支结构(elif)
|
||
- 结构:
|
||
```python
|
||
if 条件1:
|
||
# 条件1成立时执行
|
||
elif 条件2:
|
||
# 条件2成立时执行
|
||
elif 条件3:
|
||
# 条件3成立时执行
|
||
else:
|
||
# 所有条件都不成立时执行
|
||
```
|
||
- 应用:数字正负零判断、成绩评级等
|
||
|
||
示例代码:
|
||
```python
|
||
num = int(input('请输入一个数字'))
|
||
if num > 0:
|
||
print(f'你输入的数字{num}是一个大于0的数字')
|
||
elif num < 0:
|
||
print(f'你输入的数字{num}是一个小于0的数字')
|
||
else:
|
||
print(f'你输入的数字{num}是一个等于0的数字')
|
||
|
||
score = int(input("请输入分数:"))
|
||
if 90 <= score <= 100:
|
||
print("你的成绩等级是 A")
|
||
elif 80 <= score < 90:
|
||
print("你的成绩等级是 B")
|
||
elif 70 <= score < 80:
|
||
print("你的成绩等级是 C")
|
||
elif 60 <= score < 70:
|
||
print("你的成绩等级是 D")
|
||
elif 0 <= score < 60:
|
||
print("你的成绩等级是 F")
|
||
else:
|
||
print("分数输入错误,请输入 0-100 之间的整数")
|
||
```
|
||
|
||
### 6.2 综合练习
|
||
- 判断奇偶
|
||
- 判断正负零
|
||
- 绝对值计算
|
||
- 比较两个数大小
|
||
- 能否被3和5同时整除
|
||
- 判断闰年
|
||
- 简单计算器
|
||
- 判断三角形类型
|
||
- 字母大小写转换
|
||
- 生肖计算
|
||
- ATM取款机
|
||
- 简单彩票系统
|
||
|
||
示例代码(部分):
|
||
```python
|
||
# 判断奇偶
|
||
num = int(input("请输入一个整数:"))
|
||
if num % 2 == 0:
|
||
print(f"{num} 是偶数")
|
||
else:
|
||
print(f"{num} 是奇数")
|
||
|
||
# 绝对值
|
||
num = int(input("请输入一个整数:"))
|
||
if num < 0:
|
||
num = -num
|
||
print(f"绝对值是 {num}")
|
||
|
||
# 简单计算器
|
||
num1 = float(input("请输入第一个数:"))
|
||
operator = input("请输入运算符(+、-、*、/):")
|
||
num2 = float(input("请输入第二个数:"))
|
||
if operator == "+":
|
||
print(f"结果是 {num1 + num2}")
|
||
elif operator == "-":
|
||
print(f"结果是 {num1 - num2}")
|
||
elif operator == "*":
|
||
print(f"结果是 {num1 * num2}")
|
||
elif operator == "/":
|
||
if num2 == 0:
|
||
print("除数不能为 0!")
|
||
else:
|
||
print(f"结果是 {num1 / num2}")
|
||
else:
|
||
print("无效的运算符")
|
||
|
||
# 判断三角形类型
|
||
a, b, c = map(int, input("请输入三条边长(用空格分隔):").split())
|
||
if a + b > c and a + c > b and b + c > a:
|
||
if a == b == c:
|
||
print("等边三角形")
|
||
elif a == b or b == c or a == c:
|
||
print("等腰三角形")
|
||
elif a ** 2 + b ** 2 == c ** 2 or a ** 2 + c ** 2 == b ** 2 or b ** 2 + c ** 2 == a ** 2:
|
||
print("直角三角形")
|
||
else:
|
||
print("普通三角形")
|
||
else:
|
||
print("无法构成三角形")
|
||
|
||
# 生肖计算
|
||
zodiac = ["猴", "鸡", "狗", "猪", "鼠", "牛", "虎", "兔", "龙", "蛇", "马", "羊"]
|
||
year = int(input("请输入年份:"))
|
||
print(f"{year} 属 {zodiac[year % 12]}")
|
||
```
|
||
|
||
## Day 7: 条件语句进阶
|
||
|
||
### 7.1 if语句基础
|
||
```python
|
||
# if语句 单分支
|
||
num = -10
|
||
if num > 0:
|
||
print('num是正数')
|
||
|
||
# if else语句 双分支
|
||
age = int(input('请输入你的年龄'))
|
||
if age>=18:
|
||
print('成年人')
|
||
else:
|
||
print('没有成年')
|
||
|
||
# elif语句 多分支
|
||
num = int(input('请输入一个数字'))
|
||
if num>0:
|
||
print('正数')
|
||
elif num<0:
|
||
print('负数')
|
||
else:
|
||
print('等于0')
|
||
```
|
||
|
||
### 7.2 if语句嵌套
|
||
- 在if语句内部可以嵌套其他if语句
|
||
- 外层条件满足时才会执行内层条件判断
|
||
- 语法结构:
|
||
```python
|
||
if 外层条件:
|
||
# 外层条件为真时执行的代码
|
||
if 内层条件:
|
||
# 内层条件为真时执行的代码
|
||
else:
|
||
# 内层条件为假时执行的代码
|
||
else:
|
||
# 外层条件为假时执行的代码
|
||
```
|
||
|
||
示例代码:
|
||
```python
|
||
# 判断是否有火车票和刀具长度
|
||
ticket = True
|
||
knife = 34
|
||
if ticket==True:
|
||
print('恭喜你 有票')
|
||
if knife<10:
|
||
print('可以携带')
|
||
else:
|
||
print('不可以携带')
|
||
else:
|
||
print('很遗憾 没有票')
|
||
|
||
# 猜拳游戏
|
||
import random
|
||
my_num = int(input('请输入数字0-2:')) # 0:石头 1:剪刀 2:布
|
||
if my_num <= 2:
|
||
computer_num = random.randint(0,2)
|
||
if (my_num == 0 and computer_num==1) or (my_num == 1 and computer_num == 2) or (my_num == 2 and computer_num == 0):
|
||
print(f'我们赢了,计算机是{computer_num},恭喜!')
|
||
else:
|
||
print(f'我们输了,计算机是{computer_num},计算机赢了')
|
||
else:
|
||
print('你输入的数字不合法')
|
||
```
|
||
|
||
### 7.3 综合练习
|
||
1. 比较两个数的大小
|
||
```python
|
||
n1 = int(input('请输入第一个整数:'))
|
||
n2 = int(input('请输入第二个整数:'))
|
||
if n1 > n2:
|
||
print(f'最大的数字是:{n1}')
|
||
elif n1 < n2:
|
||
print(f'最大的数字是:{n2}')
|
||
else:
|
||
print(f'n1:{n1}和n2:{n2}是相等的')
|
||
```
|
||
|
||
2. 判断三角形类型
|
||
```python
|
||
n1 = int(input('请输入第一个边的长度:'))
|
||
n2 = int(input('请输入第二个边的长度:'))
|
||
n3 = int(input('请输入第三个边的长度:'))
|
||
if n1 == n2 == n3:
|
||
print(f'你输入的n1={n1},n2={n2},n3={n3}相同是等边三角形')
|
||
elif n1 == n2 or n2 == n3 or n1 == n3:
|
||
print(f'你输入的n1={n1},n2={n2},n3={n3}任意两边相同是等腰三角形')
|
||
else:
|
||
print('你输入的三个数字不相等,是一个普通三角形')
|
||
```
|
||
|
||
3. 体重标准判断
|
||
```python
|
||
height = int(input('请输入你的身高cm:'))
|
||
weight = int(input('请输入你的体重斤:'))
|
||
max_weight = (height-108)* 2 + 10 # 最大体重的分界点
|
||
min_weight = (height-108)* 2 - 10 # 最小体重的分界点
|
||
if weight > max_weight:
|
||
print('你太胖了,需要减减肥!')
|
||
elif weight < min_weight:
|
||
print('你太瘦了,需要多多加强营养!')
|
||
else:
|
||
print('你是标准身材,请继续保持!')
|
||
```
|
||
|
||
## Day 8: 循环结构基础
|
||
|
||
### 8.1 高级练习
|
||
1. 复杂身份验证系统
|
||
```python
|
||
username = input("请输入用户名: ")
|
||
password = input("请输入密码: ")
|
||
|
||
if username == "admin":
|
||
if password == "admin123":
|
||
print("欢迎管理员登录!")
|
||
else:
|
||
print("用户名或密码错误")
|
||
elif username == "user":
|
||
if password == "user456":
|
||
print("欢迎用户登录!")
|
||
else:
|
||
print("用户名或密码错误")
|
||
else:
|
||
print("用户不存在")
|
||
```
|
||
|
||
2. ATM取款机(加强版)
|
||
```python
|
||
balance = 10000
|
||
daily_limit = 10000 # 每日可取款额度
|
||
|
||
amount = int(input("请输入取款金额(100 的倍数): "))
|
||
|
||
if amount % 100 != 0:
|
||
print("错误:取款金额必须是 100 的倍数")
|
||
elif amount > balance:
|
||
print("错误:余额不足")
|
||
elif amount > 3000:
|
||
print("错误:单次取款金额不得超过 3000 元")
|
||
elif amount > daily_limit:
|
||
print("错误:超过每日取款限额")
|
||
else:
|
||
balance -= amount
|
||
daily_limit -= amount
|
||
print(f"取款成功,余额为 {balance} 元,今日还可取 {daily_limit} 元")
|
||
```
|
||
|
||
3. 复杂成绩评级
|
||
```python
|
||
score = int(input("请输入成绩 (0-100): "))
|
||
|
||
if 95 <= score <= 100:
|
||
print("评级: A+")
|
||
if score == 100:
|
||
print("满分!你太棒了!")
|
||
elif 90 <= score < 95:
|
||
print("评级: A")
|
||
elif 85 <= score < 90:
|
||
print("评级: B+")
|
||
elif 80 <= score < 85:
|
||
print("评级: B")
|
||
elif 70 <= score < 80:
|
||
print("评级: C")
|
||
elif 60 <= score < 70:
|
||
print("评级: D")
|
||
elif 0 <= score < 60:
|
||
print("评级: F")
|
||
else:
|
||
print("输入错误,请输入 0-100 之间的成绩")
|
||
```
|
||
|
||
### 8.2 循环的意义
|
||
- 循环是程序中广泛存在的基础功能
|
||
- 用于重复执行某些操作
|
||
- Python中的循环语句:
|
||
1. while循环
|
||
2. for...in循环
|
||
- 循环的组成:
|
||
1. 定义循环的关键字(while/for/in)
|
||
2. 限制条件(终止条件)
|
||
3. 循环体(满足条件执行的代码)
|
||
- 死循环:无法靠自身条件终止的循环
|
||
|
||
### 8.3 while循环
|
||
- 语法结构:
|
||
```python
|
||
while 判断条件:
|
||
满足条件执行语句
|
||
...
|
||
```
|
||
|
||
- 注意事项:
|
||
1. 初始值
|
||
2. while + 限制条件
|
||
3. 满足条件执行的循环体
|
||
4. 初始值的迭代(累加/累减)
|
||
|
||
示例代码:
|
||
```python
|
||
# 打印100-200之间能被3和7整除的数
|
||
num = 100 # 初始值
|
||
while num <= 200: # 条件1:100-200
|
||
# 条件2:能被3和7整除
|
||
if(num % 3 == 0 and num % 7 == 0):
|
||
print(num) # 打印结果
|
||
num += 1 # 累加 初始值的迭代
|
||
```
|
||
|
||
## Day 9: 循环控制语句
|
||
|
||
### 9.1 正向和反向循环
|
||
```python
|
||
# 正向循环:输出数字1-10
|
||
num = 1
|
||
while num <= 10:
|
||
print(num)
|
||
num += 1
|
||
|
||
# 反向循环:输出数字10-1
|
||
num = 10
|
||
while num >= 1:
|
||
print(num)
|
||
num -= 1
|
||
```
|
||
|
||
### 9.2 break和continue关键字
|
||
- break:直接结束整个循环
|
||
- continue:中断本次循环,继续下一次循环
|
||
|
||
示例代码:
|
||
```python
|
||
# break示例
|
||
num = 1
|
||
while num <= 10:
|
||
if num == 5:
|
||
break # 当num等于5时结束循环
|
||
print(f'这是第{num}次循环')
|
||
num += 1
|
||
|
||
# continue示例
|
||
num = 0
|
||
while num < 10:
|
||
num += 1
|
||
if num == 5:
|
||
continue # 当num等于5时跳过本次循环
|
||
print(f'这是第{num}次循环')
|
||
```
|
||
|
||
### 9.3 循环练习
|
||
1. 打印1-100之间的偶数
|
||
```python
|
||
num = 1
|
||
while num <= 100:
|
||
if num % 2 == 0:
|
||
print(num)
|
||
num += 1
|
||
```
|
||
|
||
2. 计算1-100的和
|
||
```python
|
||
sum = 0
|
||
num = 1
|
||
while num <= 100:
|
||
sum += num
|
||
num += 1
|
||
print(f'1到100的和是:{sum}')
|
||
```
|
||
|
||
3. 打印九九乘法表
|
||
```python
|
||
i = 1
|
||
while i <= 9:
|
||
j = 1
|
||
while j <= i:
|
||
print(f'{j}×{i}={i*j}', end='\t')
|
||
j += 1
|
||
print() # 换行
|
||
i += 1
|
||
```
|
||
|
||
4. 猜数字游戏
|
||
```python
|
||
import random
|
||
target = random.randint(1, 100)
|
||
count = 0
|
||
|
||
while True:
|
||
guess = int(input('请猜一个1-100之间的数字:'))
|
||
count += 1
|
||
|
||
if guess > target:
|
||
print('太大了')
|
||
elif guess < target:
|
||
print('太小了')
|
||
else:
|
||
print(f'恭喜你猜对了!答案就是{target}')
|
||
print(f'你总共猜了{count}次')
|
||
break
|
||
```
|
||
|
||
## Day 10: for循环与三目运算符
|
||
|
||
### 10.1 三目运算符
|
||
- 语法:`结果1 if 条件 else 结果2`
|
||
- 作用:根据条件判断,选择不同的结果
|
||
|
||
示例代码:
|
||
```python
|
||
a = 100
|
||
b = 20
|
||
max = a if a > b else b
|
||
print(max)
|
||
|
||
# 等价于:
|
||
if a > b:
|
||
max = a
|
||
else:
|
||
max = b
|
||
print(max)
|
||
```
|
||
|
||
### 10.2 for循环
|
||
- for循环用于对序列类型(如字符串、列表、元组等)进行逐个处理
|
||
- 语法结构:
|
||
```python
|
||
for 临时变量 in 待处理的数据集:
|
||
循环体
|
||
```
|
||
- 临时变量:每次循环时取到的数据项
|
||
- 循环体:对每个数据项要执行的操作
|
||
|
||
示例代码:
|
||
```python
|
||
str = 'hello'
|
||
for s in str:
|
||
print(s)
|
||
```
|
||
|
||
### 10.3 range函数
|
||
- 用于生成一系列数字,常与for循环配合使用
|
||
- 用法:
|
||
- `range(num)`:从0到num-1
|
||
- `range(start, end)`:从start到end-1
|
||
- `range(start, end, step)`:从start到end-1,步长为step
|
||
|
||
示例代码:
|
||
```python
|
||
for n in range(10):
|
||
print(n)
|
||
|
||
for n in range(1, 10):
|
||
print(n)
|
||
|
||
for n in range(1, 10, 2):
|
||
print(n)
|
||
```
|
||
|
||
## Day 11: 循环案例精讲
|
||
|
||
### 11.1 求100-999之间的水仙花数
|
||
- 水仙花数:一个n位数,其每个位上的数字的n次幂之和等于它本身。
|
||
- 三位数水仙花数示例:153(1^3 + 5^3 + 3^3 = 153)
|
||
|
||
示例代码:
|
||
```python
|
||
for num in range(100, 1000):
|
||
a = num % 10 # 个位
|
||
b = num % 100 // 10 # 十位
|
||
c = num // 100 # 百位
|
||
if a**3 + b**3 + c**3 == num:
|
||
print(num, end=',')
|
||
```
|
||
|
||
### 11.2 打印100以内不带7且不是7的倍数的数
|
||
- 条件:不是7的倍数,个位和十位都不能是7
|
||
|
||
示例代码:
|
||
```python
|
||
for num in range(1, 101):
|
||
if (num % 7 != 0) and (num % 10 != 7) and (num // 10 != 7):
|
||
print(num, end=',')
|
||
```
|
||
|
||
### 11.3 判断素数
|
||
- 素数:只能被1和自身整除的数,最小的素数是2
|
||
|
||
示例代码:
|
||
```python
|
||
num = int(input('请输入一个数字:'))
|
||
flag = True
|
||
if num < 2:
|
||
flag = False
|
||
else:
|
||
for i in range(2, num):
|
||
if num % i == 0:
|
||
flag = False
|
||
break
|
||
if flag:
|
||
print(f'{num}是素数')
|
||
else:
|
||
print(f'{num}不是素数')
|
||
```
|
||
|
||
## Day 12: 数据容器入门与列表
|
||
|
||
### 12.1 数据容器入门
|
||
- 数据容器是一种可以容纳多个数据的数据类型,每个数据被称为元素。
|
||
- 数据容器的特点:
|
||
1. 可以容纳多份数据。
|
||
2. 是否支持重复数据。
|
||
3. 是否可以修改。
|
||
4. 是否有序。
|
||
- 数据容器的类型:
|
||
- 列表(list)
|
||
- 元组(tuple)
|
||
- 字符串(str)
|
||
- 集合(set)
|
||
- 字典(dict)
|
||
|
||
### 12.2 列表的创建与索引
|
||
- 列表由一系列按照特定顺序排列的元素组成。
|
||
- 定义方式:使用方括号`[]`,用逗号分隔元素。
|
||
- 示例代码:
|
||
```python
|
||
list_names = ['李一', '张三', '李四']
|
||
list_nums = [100, 200, 300, 400]
|
||
print(list_names, list_nums)
|
||
```
|
||
|
||
- 输出列表的值和类型:
|
||
```python
|
||
print(list_names)
|
||
print(type(list_names)) # <class 'list'>
|
||
```
|
||
|
||
- 下标索引:列表的每个元素都有一个编号,从左到右,默认从0开始。
|
||
- 示例代码:
|
||
```python
|
||
list_names = ['李一', '张三', '李四', '老王', 'wangwu']
|
||
print(list_names[0]) # 李一
|
||
print(list_names[1]) # 张三
|
||
print(list_names[2]) # 李四
|
||
print(list_names[3]) # 老王
|
||
print(list_names[4]) # wangwu
|
||
```
|
||
|
||
- 修改元素的值:
|
||
```python
|
||
list_names[1] = '尼古拉斯'
|
||
print(list_names) # ['李一', '尼古拉斯', '李四', '老王', 'wangwu']
|
||
```
|
||
|
||
- 反向索引:从后到前,从-1开始。
|
||
- 示例代码:
|
||
```python
|
||
print(list_names[-1]) # wangwu
|
||
print(list_names[-2]) # 老王
|
||
print(list_names[-3]) # 李四
|
||
print(list_names[-4]) # 张三
|
||
print(list_names[-5]) # 李一
|
||
```
|
||
|
||
- 列表可以存储多个数据,并且可以存储不同的数据类型,同时支持嵌套。
|
||
- 示例代码:
|
||
```python
|
||
list_nums = [[4, 5, 6], [6, 7, 8], [10, 11]]
|
||
print(list_nums[0]) # [4, 5, 6]
|
||
print(list_nums[0][0]) # 4
|
||
```
|
||
|
||
- 多维列表示例:
|
||
```python
|
||
list = [1, [2, 3, [4, [5, 6, [7, 8, [9, 10]]]]]]
|
||
print(list[1][2][1][2][2][0]) # 9
|
||
```
|
||
|
||
## Day 13: 列表的操作与常用方法
|
||
|
||
### 13.1 列表的操作
|
||
- 修改列表中的元素值:
|
||
```python
|
||
list = [100, 200, 300, 400, 500]
|
||
list[2] = 3
|
||
print(list) # [100, 200, 3, 400, 500]
|
||
```
|
||
|
||
- 修改区间值:
|
||
```python
|
||
list = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
|
||
list[1:5] = [100, 200, 300, 400] # 替换索引1到4的元素
|
||
print(list) # [0, 100, 200, 300, 400, 5, 6, 7, 8, 9]
|
||
```
|
||
|
||
- 添加步长:
|
||
```python
|
||
list = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
|
||
list[1:9:2] = ['奇数', '奇数', '奇数', '奇数'] # 步长为2,从索引1开始替换
|
||
print(list) # [0, '奇数', 2, '奇数', 4, '奇数', 6, '奇数', 8, 9]
|
||
```
|
||
|
||
- 重复列表:
|
||
```python
|
||
list = [1, 2, 3]
|
||
print(list * 3) # [1, 2, 3, 1, 2, 3, 1, 2, 3]
|
||
```
|
||
|
||
- 列表拼接:
|
||
```python
|
||
list = [12, 13, 14]
|
||
print(list + [4, 5, 6]) # [12, 13, 14, 4, 5, 6]
|
||
print(list + [4, 5, 6] + [20, 30, 40, 50]) # [12, 13, 14, 4, 5, 6, 20, 30, 40, 50]
|
||
```
|
||
|
||
### 13.2 列表的常用方法
|
||
- 在Python中,一切皆对象,列表也是一个对象,由属性和方法组成。
|
||
- 常用方法:
|
||
1. `list.index(元素)`:查找指定元素在列表中的索引,如果找不到则报错。
|
||
2. `list.append(x)`:将x作为一个元素添加到列表list中(x可以是列表或元素)。
|
||
|
||
示例代码:
|
||
```python
|
||
list = ['zhangsan', 'lisi', 'wangwu']
|
||
print(list.index('lisi')) # 1
|
||
|
||
list = ['a', 'b']
|
||
list.append('c')
|
||
list.append('d')
|
||
list.append(['e', 'f', 'g'])
|
||
print(list) # ['a', 'b', 'c', 'd', ['e', 'f', 'g']]
|
||
```
|
||
|
||
- 案例:创建一个列表,里面是0开始的偶数,一直到100。
|
||
```python
|
||
list = [] # 创建一个空列表
|
||
for num in range(0, 101): # 循环1-100
|
||
if num % 2 == 0: # 选择1-100的偶数
|
||
list.append(num) # 将偶数追加到列表中
|
||
print(list) # [0, 2, 4, ..., 100]
|
||
```
|
||
|
||
## Day 14: 列表的方法总结与应用
|
||
|
||
### 14.1 列表的方法总结
|
||
- `list.extend()`:将列表中的元素增加到列表中去。
|
||
- `list.pop(x)`:如果括号里没有参数,默认删除最后一项;如果写了参数,将列表中的第x个元素取出并删除。
|
||
- `list.remove(x)`:将列表中出现的第一个元素x删除。
|
||
- `list.clear()`:删除所有的元素。
|
||
- `list.insert(i, x)`:在列表的第i个位置插入字符x。
|
||
- `list.reverse()`:将列表list里面的元素反转原地保存。
|
||
- `list.sort()`:将列表list里面的元素排序。
|
||
|
||
示例代码:
|
||
```python
|
||
list = ['a', 'b']
|
||
list.extend('c')
|
||
list.extend(['d', 'e'])
|
||
print(list) # ['a', 'b', 'c', 'd', 'e']
|
||
|
||
list = ['a', 'b', 'c', 'd']
|
||
print(list.pop()) # 'd'
|
||
print(list) # ['a', 'b', 'c']
|
||
|
||
list = ['a', 'b', 'c', 'd', 'e', 'f', 'g']
|
||
list.remove('c') # 删除第一个c字符
|
||
print(list) # ['a', 'b', 'd', 'e', 'f', 'g']
|
||
|
||
list = ['a', 'b', 'c', 'd', 'e']
|
||
list.clear()
|
||
print(list) # []
|
||
|
||
list = ['a', 'b', 'c', 'd']
|
||
list.insert(1, 'x') # 在下标为1的位置插入字符x
|
||
print(list) # ['a', 'x', 'b', 'c', 'd']
|
||
|
||
list = ['a', 'b', 'c']
|
||
list.insert(1, ['x', 'y', 'z']) # 在下标为1的位置插入多个字符
|
||
print(list) # ['a', ['x', 'y', 'z'], 'b', 'c']
|
||
|
||
list = ['a', 'b', 'c', 'd']
|
||
list.reverse()
|
||
print(list) # ['d', 'c', 'b', 'a']
|
||
|
||
list = [12, 3, 1, 78, 88, 90, 34, 56]
|
||
list.sort(reverse=False) # 默认升序
|
||
print(list) # [1, 3, 12, 34, 56, 78, 88, 90]
|
||
|
||
list = [1, 2, 36, 7, 89, 100, 34, 78]
|
||
list.sort(reverse=True) # 降序排序
|
||
print(list) # [100, 89, 78, 36, 34, 7, 2, 1]
|
||
```
|
||
|
||
## Day 15: 列表遍历与元组
|
||
|
||
### 15.1 列表的遍历
|
||
列表遍历是指按照需求依次取出列表中的元素进行操作。Python提供了两种遍历方式:
|
||
|
||
1. while循环遍历:
|
||
```python
|
||
list = ['apple', 'banana', 'orange', 'grape']
|
||
index = 0
|
||
while index < len(list):
|
||
print(list[index])
|
||
index += 1
|
||
```
|
||
|
||
2. for循环遍历:
|
||
```python
|
||
list = ['apple', 'banana', 'orange', 'grape']
|
||
for v in list:
|
||
print(v)
|
||
```
|
||
|
||
while循环和for循环的对比:
|
||
1. 循环条件控制:
|
||
- while循环可以自定义循环条件,并自行控制
|
||
- for循环不可以自定义循环条件,只能一个个从容器内取出数据
|
||
2. 无限循环:
|
||
- while循环可以通过条件控制做到无限循环
|
||
- for循环理论上不可以,因为被遍历的容器容量不是无限的
|
||
3. 使用场景:
|
||
- while循环适用于任何想要循环的场景
|
||
- for循环适用于遍历数据容器的场景或简单的固定次数循环场景
|
||
|
||
### 15.2 列表遍历的应用
|
||
示例:创建一个列表,包含1-100的偶数,每5个数求平均数,并将平均值放入新列表
|
||
```python
|
||
# 第一步:生成1-100的偶数列表
|
||
list = []
|
||
for i in range(1, 101):
|
||
if i % 2 == 0:
|
||
list.append(i)
|
||
print(list) # [2, 4, 6, ..., 100]
|
||
|
||
# 第二步:每5个数求平均数
|
||
result = 0
|
||
new_list = []
|
||
for index in range(len(list)):
|
||
result += list[index]
|
||
if (index + 1) % 5 == 0:
|
||
new_list.append(result / 5)
|
||
result = 0
|
||
print(new_list) # [6.0, 16.0, 26.0, 36.0, 46.0, 56.0, 66.0, 76.0, 86.0, 96.0]
|
||
```
|
||
|
||
### 15.3 元组
|
||
元组(tuple)是一种不可变的数据容器,可以封装多个不同类型的元素。
|
||
|
||
1. 定义元组:
|
||
```python
|
||
t1 = ('zhangsan', 'lisi', 'wangwu')
|
||
t2 = ('apple',) # 如果只有一个值,也要添加逗号,否则不是元组
|
||
print(type(t1)) # <class 'tuple'>
|
||
```
|
||
|
||
2. 元组的读写:
|
||
```python
|
||
# 读取元组的值
|
||
print(t1[0]) # 'zhangsan'
|
||
print(t1[1]) # 'lisi'
|
||
print(t1[2]) # 'wangwu'
|
||
|
||
# 修改元组的值(会报错)
|
||
# t1[0] = '张三' # TypeError: 'tuple' object does not support item assignment
|
||
```
|
||
|
||
3. 元组的嵌套:
|
||
```python
|
||
t1 = (('zhangsan', 'lisi', 'wangwu'), ('apple', 'orange'), ('jack', 'tom'))
|
||
print(t1[0]) # ('zhangsan', 'lisi', 'wangwu')
|
||
print(t1[0][1]) # 'lisi'
|
||
```
|
||
|
||
元组的特点:
|
||
- 有序:可以通过索引访问元素
|
||
- 不可变:一旦定义后不能修改
|
||
- 可以包含重复值
|
||
- 可以包含不同类型的元素
|
||
- 支持嵌套使用
|
||
|
||
## Day 16: 元组的进阶操作
|
||
|
||
### 16.1 元组的操作符
|
||
1. 拼接和重复:
|
||
```python
|
||
t1 = (1, 2, 3)
|
||
t2 = (4, 5, 6)
|
||
print(t1 + t2) # (1, 2, 3, 4, 5, 6) 拼接
|
||
print(t1 + (7, 8, 9)) # (1, 2, 3, 7, 8, 9) 拼接
|
||
print(t1 * 4) # (1, 2, 3, 1, 2, 3, 1, 2, 3, 1, 2, 3) 重复
|
||
```
|
||
|
||
2. in操作符:
|
||
```python
|
||
t1 = ('apple', 'orange', 'mango')
|
||
print('orange' in t1) # True
|
||
print('pear' in t1) # False
|
||
```
|
||
|
||
### 16.2 元组和列表的混合使用
|
||
元组中可以包含列表,且列表中的元素可以修改:
|
||
```python
|
||
t1 = ('zhangsan', ['a', 'b', 'c'])
|
||
print(t1[1]) # ['a', 'b', 'c']
|
||
print(t1[1][1]) # 'b'
|
||
t1[1][1] = 'B' # 修改列表中的元素
|
||
print(t1) # ('zhangsan', ['a', 'B', 'c'])
|
||
```
|
||
|
||
### 16.3 元组的遍历
|
||
```python
|
||
nums = (1, 2, 3, 4, 5, 6, 7, 8, 9, 10)
|
||
for v in nums:
|
||
print(v * 100, end=',') # 将值扩大100倍
|
||
```
|
||
|
||
### 16.4 元组和列表的转换
|
||
1. list()函数:将可遍历对象转换为列表
|
||
```python
|
||
print(list('hello')) # ['h', 'e', 'l', 'l', 'o'] 字符串转列表
|
||
print(list((1, 2, 3, 4, 5))) # [1, 2, 3, 4, 5] 元组转列表
|
||
```
|
||
|
||
2. tuple()函数:将可遍历对象转换为元组
|
||
```python
|
||
print(tuple('hello')) # ('h', 'e', 'l', 'l', 'o') 字符串转元组
|
||
print(tuple([1, 2, 3, 4, 5])) # (1, 2, 3, 4, 5) 列表转元组
|
||
```
|
||
|
||
### 16.5 元组的方法和函数
|
||
1. 元组的方法:
|
||
- index():查找元素,返回下标(不存在则报错)
|
||
```python
|
||
t1 = ('banana', 'apple', 'mango', 'pear', 'orange')
|
||
print(t1.index('orange')) # 4
|
||
```
|
||
|
||
- count():统计元素出现次数
|
||
```python
|
||
t1 = ('apple', 'apple', 'apple', 'orange', 'pear')
|
||
print(t1.count('apple')) # 3
|
||
print(t1.count('hehe')) # 0
|
||
```
|
||
|
||
2. 元组的函数:
|
||
- len():统计元素个数
|
||
```python
|
||
t1 = ('apple', 'apple', 'apple', 'orange', 'pear', 'orange')
|
||
print(len(t1)) # 6
|
||
```
|
||
|
||
- sorted():排序(返回列表)
|
||
```python
|
||
t2 = (12, 4, 67, 8, 10, 1)
|
||
print(sorted(t2)) # [1, 4, 8, 10, 12, 67] 升序
|
||
print(sorted(t2, reverse=True)) # [67, 12, 10, 8, 4, 1] 降序
|
||
```
|
||
|
||
## Day 17: 集合
|
||
|
||
### 17.1 集合的基本概念
|
||
集合(set)是一种无序的数据容器,具有以下特点:
|
||
- 通过{}存储多个元素
|
||
- 无序的,随机顺序输出
|
||
- 不可以通过索引下标读写元素
|
||
- 不可以设置重复的值(自动去重)
|
||
|
||
1. 定义集合:
|
||
```python
|
||
s1 = {'zhangsan', 'lisi', 'zhangsan', 'lisi'} # 自动去重
|
||
print(s1) # {'zhangsan', 'lisi'}
|
||
```
|
||
|
||
2. 获取集合元素:
|
||
```python
|
||
s1 = {'shangsan', 'lisi', 'wangwu'}
|
||
for item in s1:
|
||
print(item)
|
||
```
|
||
|
||
3. 判断元素是否存在:
|
||
```python
|
||
s1 = {'zhangsan', 'lisi', 'wangwu', 'haha'}
|
||
print('zhangsan' in s1) # True
|
||
print('张三' in s1) # False
|
||
```
|
||
|
||
### 17.2 集合的方法和函数
|
||
1. 集合的方法:
|
||
- add():添加元素
|
||
```python
|
||
s1 = {'a', 'b', 'c'}
|
||
s1.add('d') # 添加单个元素
|
||
s1.add(('e', 'f')) # 添加元组
|
||
print(s1) # {('e', 'f'), 'b', 'c', 'a', 'd'}
|
||
```
|
||
|
||
- remove():移除指定元素
|
||
```python
|
||
s1 = {'apple', 'orange', 'banana'}
|
||
s1.remove('orange')
|
||
print(s1) # {'apple', 'banana'}
|
||
```
|
||
|
||
- pop():随机取出一个元素
|
||
```python
|
||
s1 = {'apple', 'orange', 'banana'}
|
||
print(s1.pop()) # 返回随机元素并从集合中删除
|
||
```
|
||
|
||
- clear():清空集合
|
||
```python
|
||
s1 = {'apple', 'orange', 'banana'}
|
||
s1.clear()
|
||
print(s1) # set()
|
||
```
|
||
|
||
2. 集合的运算:
|
||
- 并集(union 或 |):获取所有元素
|
||
```python
|
||
s1 = {1, 2, 3}
|
||
s2 = {3, 4, 5}
|
||
print(s1.union(s2)) # {1, 2, 3, 4, 5}
|
||
print(s1 | s2) # {1, 2, 3, 4, 5}
|
||
```
|
||
|
||
- 交集(intersection 或 &):获取共有元素
|
||
```python
|
||
s1 = {1, 2, 3, 4}
|
||
s2 = {1, 2, 3, 4, 5, 6}
|
||
print(s1.intersection(s2)) # {1, 2, 3, 4}
|
||
print(s1 & s2) # {1, 2, 3, 4}
|
||
```
|
||
|
||
- 差集(difference 或 -):获取独有元素
|
||
```python
|
||
s1 = {1, 2, 3, 4, 5}
|
||
s2 = {3, 4, 5, 6, 7, 8, 9}
|
||
print(s1 - s2) # {1, 2}
|
||
print(s1.difference(s2)) # {1, 2}
|
||
```
|
||
|
||
- 非对称差集(^):获取非公共元素
|
||
```python
|
||
s1 = {1, 2, 3, 4, 5}
|
||
s2 = {3, 4, 5, 6, 7, 8, 9}
|
||
print(s1 ^ s2) # {1, 2, 6, 7, 8, 9}
|
||
```
|
||
|
||
### 17.3 集合的转换
|
||
```python
|
||
list_nums = [12, 34, 56, 78, 12, 34, 56, 78]
|
||
print(set(list_nums)) # {56, 34, 12, 78} 列表转集合(去重)
|
||
print(list(set(list_nums))) # [56, 34, 12, 78] 集合转列表
|
||
```
|
||
|
||
## Day 18: 数据容器梳理与字典
|
||
|
||
### 18.1 数据容器梳理
|
||
Python中的5种数据容器:
|
||
1. 列表(list):
|
||
- 存储多个元素
|
||
- 有序
|
||
- 可以重复
|
||
- 可以通过索引下标进行读写
|
||
|
||
2. 元组(tuple):
|
||
- 存储多个元素
|
||
- 有序
|
||
- 可以重复
|
||
- 可以通过索引下标进行获取,不能修改
|
||
|
||
3. 集合(set):
|
||
- 存储多个元素
|
||
- 无序
|
||
- 不能重复
|
||
- 没有索引下标
|
||
- 可修改
|
||
|
||
4. 字典(dict):键值对形式存储数据
|
||
5. 字符串(str):字符序列
|
||
|
||
创建符号:
|
||
- 列表:[1, 2, 3, 4, 5]
|
||
- 元组:(1, 2, 3, 4, 5)
|
||
- 集合:{1, 2, 3, 4, 5}
|
||
- 字典:{'key': 'value'}
|
||
|
||
通用函数:
|
||
- len():统计元素个数
|
||
- sorted():对元素进行排序
|
||
|
||
### 18.2 字典的基本概念
|
||
字典是一种键值对形式的数据容器,具有以下特点:
|
||
- 使用{}存储数据
|
||
- 每条数据包含键(key)和值(value)
|
||
- 键值对之间用逗号分隔
|
||
- 键必须是唯一的,值可以重复
|
||
|
||
1. 字典的创建:
|
||
```python
|
||
student = {
|
||
'name': 'lisi',
|
||
'gender': '男',
|
||
'age': 20
|
||
}
|
||
print(type(student)) # <class 'dict'>
|
||
```
|
||
|
||
2. 字典的读写:
|
||
```python
|
||
# 读取值
|
||
print(student['name']) # 'lisi'
|
||
|
||
# 修改值
|
||
student['name'] = 'zhangsan'
|
||
print(student) # {'name': 'zhangsan', 'gender': '男', 'age': 20}
|
||
```
|
||
|
||
3. 字典的嵌套:
|
||
```python
|
||
my_dict = {
|
||
'k1': {'语文': 77, '数学': 66, '英语': 88},
|
||
'k2': {'语文': 71, '数学': 61, '英语': 81}
|
||
}
|
||
print(my_dict['k1']) # {'语文': 77, '数学': 66, '英语': 88}
|
||
print(my_dict['k1']['数学']) # 66
|
||
```
|
||
|
||
### 18.3 字典的方法
|
||
1. pop(key):删除指定键值对并返回值
|
||
```python
|
||
result = {'语文': 77, '数学': 66, '英语': 33}
|
||
print(result.pop('数学')) # 66
|
||
print(result) # {'语文': 77, '英语': 33}
|
||
```
|
||
|
||
2. popitem():删除并返回最后一对键值对
|
||
```python
|
||
result = {'语文': 77, '数学': 66, '英语': 33}
|
||
print(result.popitem()) # ('英语', 33)
|
||
print(result) # {'语文': 77, '数学': 66}
|
||
```
|
||
|
||
3. clear():清空字典
|
||
```python
|
||
result = {'语文': 77, '数学': 66, '英语': 33}
|
||
result.clear()
|
||
print(result) # {}
|
||
```
|
||
|
||
4. keys():获取所有键
|
||
```python
|
||
person = {
|
||
'name': 'zhangsan',
|
||
'sex': '男',
|
||
'age': 19,
|
||
'class': 'IT231'
|
||
}
|
||
print(person.keys()) # dict_keys(['name', 'sex', 'age', 'class'])
|
||
|
||
# 遍历键
|
||
for key in person.keys():
|
||
print(key)
|
||
```
|
||
|
||
5. values():获取所有值
|
||
```python
|
||
print(person.values()) # dict_values(['zhangsan', '男', 19, 'IT231'])
|
||
```
|
||
|
||
## Day 19: 数据容器梳理与算法题
|
||
|
||
### 19.1 数据容器梳理
|
||
数据容器是一种可以容纳多个数据的数据类型,每个数据被称为元素,可以是任意数据类型。
|
||
|
||
1. 列表(list):
|
||
- 使用中括号[]定义
|
||
- 特点:
|
||
- 可以重复
|
||
- 有序(有索引)
|
||
- 可以修改
|
||
- 操作:定义、遍历、方法和函数
|
||
|
||
2. 元组(tuple):
|
||
- 使用小括号()定义
|
||
- 特点:
|
||
- 可以重复
|
||
- 有序(有索引)
|
||
- 不可修改
|
||
- 操作:定义、遍历、方法和函数
|
||
|
||
3. 集合(set):
|
||
- 使用大括号{}定义
|
||
- 特点:
|
||
- 不可重复
|
||
- 无序
|
||
- 不可修改
|
||
- 操作:定义、遍历、方法和函数
|
||
|
||
4. 字典(dict):
|
||
- 使用大括号{}定义,存储键值对
|
||
- 特点:
|
||
- key不可重复(重复会覆盖)
|
||
- 无序(无索引)
|
||
- 可以修改值
|
||
- key和value可以是任意类型
|
||
- 操作:定义、遍历、方法和函数
|
||
|
||
5. 字符串(str):
|
||
- 使用引号定义
|
||
- 操作:遍历、方法和函数
|
||
|
||
### 19.2 数据容器的算法题
|
||
1. 列表反转:
|
||
```python
|
||
lst = [1, 2, 3, 4, 5]
|
||
reversed_lst = lst[::-1]
|
||
print(f"反转后的列表是 {reversed_lst}")
|
||
```
|
||
|
||
2. 查找列表中的最大值和最小值:
|
||
```python
|
||
lst = [3, 1, 7, 5, 2]
|
||
max_value = max(lst)
|
||
min_value = min(lst)
|
||
print(f"最大值是 {max_value}")
|
||
print(f"最小值是 {min_value}")
|
||
```
|
||
|
||
3. 字典的键值交换:
|
||
```python
|
||
d = {'a': 1, 'b': 2, 'c': 3}
|
||
reversed_dict = {v: k for k, v in d.items()}
|
||
print(f"反转后的字典是 {reversed_dict}")
|
||
```
|
||
|
||
4. 集合的运算:
|
||
```python
|
||
set1 = {1, 2, 3}
|
||
set2 = {3, 4, 5}
|
||
|
||
union = set1 | set2
|
||
intersection = set1 & set2
|
||
difference = set1 - set2
|
||
|
||
print(f"并集是 {union}")
|
||
print(f"交集是 {intersection}")
|
||
print(f"差集是 {difference}")
|
||
```
|
||
|
||
5. 元组拆包:
|
||
```python
|
||
t = (1, 2, 3, 4)
|
||
a, b, c, d = t
|
||
print(f"拆包后的元素是 {a} {b} {c} {d}")
|
||
```
|
||
|
||
6. 列表去重:
|
||
```python
|
||
lst = [1, 2, 2, 3, 3, 4]
|
||
unique_lst = list(set(lst))
|
||
print(f"去重后的列表是 {unique_lst}")
|
||
```
|
||
|
||
7. 查找出现次数最多的元素:
|
||
```python
|
||
from collections import Counter
|
||
|
||
lst = [1, 2, 3, 1, 1, 2, 4]
|
||
counter = Counter(lst)
|
||
most_common_element = counter.most_common(1)[0][0]
|
||
print(f"出现次数最多的元素是 {most_common_element}")
|
||
```
|
||
|
||
8. 计算字典值的总和:
|
||
```python
|
||
d = {'Alice': 20, 'Bob': 25, 'Charlie': 30}
|
||
total = sum(d.values())
|
||
print(f"字典中所有值的总和是 {total}")
|
||
```
|
||
|
||
9. 字典合并:
|
||
```python
|
||
dict1 = {'a': 1, 'b': 2}
|
||
dict2 = {'c': 3, 'd': 4}
|
||
merged_dict = {**dict1, **dict2}
|
||
print(f"合并后的字典是 {merged_dict}")
|
||
```
|
||
|
||
10. 从列表中删除指定元素:
|
||
```python
|
||
lst = [1, 2, 3, 1, 4, 1, 5]
|
||
remove_element = 1
|
||
new_lst = [x for x in lst if x != remove_element]
|
||
print(f"删除后的列表是 {new_lst}")
|
||
```
|
||
|
||
11. 列表中的嵌套字典:
|
||
```python
|
||
lst = [{'name': 'Alice', 'age': 20}, {'name': 'Bob', 'age': 25}]
|
||
key = 'name'
|
||
values = [d[key] for d in lst if key in d]
|
||
print(f"所有的 '{key}' 值是 {values}")
|
||
```
|
||
|
||
12. 找出列表中的最大和最小元素的差值:
|
||
```python
|
||
lst = [10, 2, 8, 6, 4]
|
||
max_val = max(lst)
|
||
min_val = min(lst)
|
||
diff = max_val - min_val
|
||
print(f"最大值和最小值之间的差是 {diff}")
|
||
```
|
||
|
||
## Day 20: 字符串的操作与方法
|
||
|
||
### 20.1 数据容器的区别
|
||
- 列表(list):有序、可重复、可修改
|
||
- 元组(tuple):有序、可重复、不可修改
|
||
- 集合(set):无序、不可重复、不可修改
|
||
- 字典(dict):无序、key重复会覆盖,通过key访问
|
||
- 字符串(str):字符序列,可遍历、不可修改
|
||
|
||
常用转换函数:
|
||
- list()、tuple()、set()、dict()、str()
|
||
|
||
### 20.2 字符串的基本操作
|
||
- 字符串是字符的容器,可以通过索引下标访问每个字符:
|
||
```python
|
||
str = 'hello'
|
||
print(str[0]) # h
|
||
print(str[-1]) # o
|
||
```
|
||
- 字符串不可修改(不可变类型)。
|
||
|
||
### 20.3 字符串的遍历
|
||
- while循环:
|
||
```python
|
||
str = 'abcdefgh'
|
||
i = 0
|
||
while i < len(str):
|
||
print(str[i])
|
||
i += 1
|
||
```
|
||
- for循环:
|
||
```python
|
||
str = 'ABCDEFGH'
|
||
for v in str:
|
||
print(v)
|
||
```
|
||
- 也可用for+range遍历索引。
|
||
|
||
### 20.4 字符串的常用方法
|
||
- lower() / upper():转小写/大写
|
||
- islower() / isnumeric():判断是否全小写/是否全为数字
|
||
- startswith()/endswith():判断是否以指定内容开头/结尾,可指定区间
|
||
- split():分割字符串为列表
|
||
- count():统计子串出现次数
|
||
- replace(old, new, count):替换子串
|
||
- center(width, fillchar):居中显示并填充
|
||
- strip(chars):去除两侧指定字符
|
||
- zfill(width):左侧补0到指定宽度
|
||
- join(iterator):用指定分隔符拼接序列
|
||
- format():格式化字符串
|
||
|
||
#### 示例代码:
|
||
```python
|
||
s = 'ABCdef'
|
||
print(s.lower()) # abcdef
|
||
print(s.upper()) # ABCDEF
|
||
print('hello'.startswith('h')) # True
|
||
print('hello'.endswith('o')) # True
|
||
print('a b c'.split()) # ['a', 'b', 'c']
|
||
print('hello,hello'.count('hello')) # 2
|
||
print('hello world'.replace('hello', 'hi')) # hi world
|
||
print('hello'.center(10, '*')) # **hello***
|
||
print(' abcd '.strip()) # abcd
|
||
print('zhangsan'.zfill(10)) # 000zhangsan
|
||
print('-'.join(['a', 'b', 'c'])) # a-b-c
|
||
print('我的名字是{0},我今年{1}岁'.format('zhangsan', 18))
|
||
```
|
||
|
||
## Day 21: 切片与字符串练习
|
||
|
||
### 21.1 切片的概念与语法
|
||
- 切片是从一个序列中截取出一个子序列的操作。
|
||
- 适用于列表、元组、字符串等序列类型。
|
||
- 语法:`序列[起始下标:结束下标:步长]`
|
||
- 起始下标:截取的起始位置,留空表示从头开始。
|
||
- 结束下标:截取的结束位置,不包含该位置,留空表示到结尾。
|
||
- 步长:每次取值的间隔,默认为1,负数表示反向取值。
|
||
|
||
#### 示例:
|
||
```python
|
||
lst = [0,1,2,3,4,5,6,7,8,9]
|
||
print(lst[2:6]) # [2, 3, 4, 5]
|
||
print(lst[::2]) # [0, 2, 4, 6, 8]
|
||
print(lst[::-1]) # [9, 8, 7, 6, 5, 4, 3, 2, 1, 0]
|
||
print(lst[-2:-5:-1]) # [8, 7, 6]
|
||
|
||
s = '0123456789'
|
||
print(s[2:5]) # 234
|
||
print(s[::-1]) # 9876543210
|
||
|
||
t = (0,1,2,3,4,5,6,7,8,9)
|
||
print(t[::-2]) # (9, 7, 5, 3, 1)
|
||
```
|
||
|
||
### 21.2 切片与字符串常见练习
|
||
1. 反转列表/字符串:
|
||
```python
|
||
lst = [1, 2, 3, 4, 5]
|
||
print(lst[::-1]) # [5, 4, 3, 2, 1]
|
||
s = "hello"
|
||
print(s[::-1]) # "olleh"
|
||
```
|
||
2. 获取子列表:
|
||
```python
|
||
lst = [10, 20, 30, 40, 50, 60]
|
||
print(lst[2:5]) # [30, 40, 50]
|
||
```
|
||
3. 隔一个取一个:
|
||
```python
|
||
s = "abcdefghij"
|
||
print(s[::2]) # "acegik"
|
||
```
|
||
4. 删除前三个元素:
|
||
```python
|
||
lst = [1,2,3,4,5,6,7,8,9]
|
||
lst = lst[3:]
|
||
print(lst) # [4, 5, 6, 7, 8, 9]
|
||
```
|
||
5. 替换中间元素:
|
||
```python
|
||
lst = [1,2,3,4,5]
|
||
lst[len(lst)//2:len(lst)//2+1] = [10]
|
||
print(lst) # [1, 2, 10, 4, 5]
|
||
```
|
||
6. 检查回文:
|
||
```python
|
||
def is_palindrome(s):
|
||
return s == s[::-1]
|
||
print(is_palindrome("radar")) # True
|
||
```
|
||
7. 合并切片:
|
||
```python
|
||
a = [1,2,3]
|
||
b = [4,5,6]
|
||
print(a[:2] + b[-2:]) # [1, 2, 5, 6]
|
||
```
|
||
8. 矩阵转置:
|
||
```python
|
||
matrix = [[1,2],[3,4],[5,6]]
|
||
transposed = [list(row) for row in zip(*matrix)]
|
||
print(transposed) # [[1, 3, 5], [2, 4, 6]]
|
||
```
|
||
9. 字符串重组:
|
||
```python
|
||
s = "HelloWorld"
|
||
idx = s.index("World")
|
||
print(s[idx:] + s[:idx]) # "WorldHello"
|
||
```
|
||
10. 列表深拷贝与浅拷贝:
|
||
```python
|
||
import copy
|
||
original = [1, 2, [3, 4]]
|
||
shallow_copy = original[:]
|
||
deep_copy = copy.deepcopy(original)
|
||
shallow_copy[2][0] = 99
|
||
print(original) # [1, 2, [99, 4]]
|
||
deep_copy[2][0] = 100
|
||
print(original) # [1, 2, [99, 4]]
|
||
```
|
||
|
||
### 21.3 字符串常见练习
|
||
1. 判断是否是回文:
|
||
```python
|
||
s = "racecar"
|
||
print(s == s[::-1]) # True
|
||
```
|
||
2. 统计某个字符出现次数:
|
||
```python
|
||
s = "hello"
|
||
print(s.count("l")) # 2
|
||
```
|
||
3. 删除字符串中的元音:
|
||
```python
|
||
s = "beautiful"
|
||
vowels = "aeiouAEIOU"
|
||
new_s = ''.join(c for c in s if c not in vowels)
|
||
print(new_s) # "btfl"
|
||
```
|
||
4. 计算字符串中的单词数量:
|
||
```python
|
||
s = "I love Python"
|
||
print(len(s.split())) # 3
|
||
```
|
||
5. 检查字符串是否只包含字母:
|
||
```python
|
||
s = "Python123"
|
||
print(s.isalpha()) # False
|
||
```
|
||
6. 字符串大小写转换:
|
||
```python
|
||
s = "Hello World"
|
||
print(s.swapcase()) # "hELLO wORLD"
|
||
```
|
||
7. 删除字符串中的重复字符(保留首次顺序):
|
||
```python
|
||
s = "banana"
|
||
seen = set()
|
||
new_s = ''.join(seen.add(c) or c for c in s if c not in seen)
|
||
print(new_s) # "ban"
|
||
```
|
||
8. 获取第一个不重复的字符:
|
||
```python
|
||
s = "swiss"
|
||
for c in s:
|
||
if s.count(c) == 1:
|
||
print(c) # "w"
|
||
break
|
||
```
|
||
9. 反转字符串中的单词:
|
||
```python
|
||
s = "I love Python"
|
||
print(' '.join(s.split()[::-1])) # "Python love I"
|
||
```
|
||
|
||
## Day 22: 推导式与相关函数
|
||
|
||
### 22.1 推导式的概念与语法
|
||
- 推导式是一种简洁的for循环写法,用于生成新的容器(列表、集合、字典)。
|
||
- 基本语法:
|
||
- 列表推导式:[表达式 for 变量 in 可迭代对象]
|
||
- 带条件的列表推导式:[表达式 for 变量 in 可迭代对象 if 条件]
|
||
- 双分支:[表达式1 if 条件 else 表达式2 for 变量 in 可迭代对象]
|
||
|
||
#### 示例:
|
||
```python
|
||
# 普通for循环
|
||
lst = [1,2,3,4,5,6,7,8,9]
|
||
newlst = []
|
||
for item in lst:
|
||
newlst.append(item * 100)
|
||
print(newlst) # [100, 200, ..., 900]
|
||
|
||
# 列表推导式
|
||
print([item * 100 for item in lst])
|
||
|
||
# 带条件的列表推导式
|
||
print([val for val in lst if val % 2 == 0]) # [2, 4, 6, 8]
|
||
|
||
# 双分支
|
||
print([True if val > 5 else False for val in lst]) # [False, False, ..., True]
|
||
```
|
||
|
||
### 22.2 集合推导式与字典推导式
|
||
- 集合推导式:用大括号包裹,生成集合
|
||
```python
|
||
set1 = {1,2,3,4,5,6,7,8,9}
|
||
newset = {val * 100 for val in set1}
|
||
print(newset)
|
||
```
|
||
- 字典推导式:用大括号包裹,生成键值对
|
||
```python
|
||
d = {'zhangsan':70, 'lisi':69, 'wangwu':60}
|
||
newdict = {key: value + 10 for key, value in d.items()}
|
||
print(newdict) # {'zhangsan': 80, 'lisi': 79, 'wangwu': 70}
|
||
```
|
||
|
||
### 22.3 推导式常见练习
|
||
1. 字典转为特定格式字符串列表:
|
||
```python
|
||
d = {'x': 'A', 'y': 'B', 'z': 'C'}
|
||
print([f'{key} = {val}' for key, val in d.items()])
|
||
```
|
||
2. 列表元素大小写转换:
|
||
```python
|
||
lst = ["ADDD","dddDD","DDaa","sss"]
|
||
print([item.lower() for item in lst])
|
||
print([item.upper() for item in lst])
|
||
```
|
||
3. 组合元组:
|
||
```python
|
||
print([(x, y) for x in range(0,6) if x%2==0 for y in range(0,6) if y%2!=0])
|
||
```
|
||
4. 99乘法表:
|
||
```python
|
||
print([f'{i}x{j}={i*j}' for i in range(1,10) for j in range(1,10)])
|
||
```
|
||
5. 矩阵元素乘积:
|
||
```python
|
||
M = [[1,2,3], [4,5,6], [7,8,9]]
|
||
N = [[2,2,2], [3,3,3], [4,4,4]]
|
||
print([M[i][j]*N[i][j] for i in range(3) for j in range(3)])
|
||
print([[M[i][j]*N[i][j] for i in range(3)] for j in range(3)])
|
||
```
|
||
|
||
### 22.4 enumerate和zip函数
|
||
- enumerate:为可迭代对象生成索引号和元素的元组
|
||
```python
|
||
lst = ['apple','banana','cherry']
|
||
print([val for val in enumerate(lst)]) # [(0, 'apple'), (1, 'banana'), (2, 'cherry')]
|
||
```
|
||
- zip:将多个可迭代对象按顺序配对成元组
|
||
```python
|
||
list1 = [1,2,3,4,5]
|
||
list2 = ['a','b','c','d']
|
||
list3 = ['A','B','C']
|
||
print([val for val in zip(list1, list2, list3)]) # [(1, 'a', 'A'), (2, 'b', 'B'), (3, 'c', 'C')]
|
||
```
|
||
|
||
## Day 23: 函数基础
|
||
|
||
### 23.1 函数的概念与定义
|
||
- 函数是一段可重复使用的代码块,用于执行特定任务
|
||
- 函数定义语法:
|
||
```python
|
||
def 函数名(参数1, 参数2, ...):
|
||
函数体
|
||
return 返回值
|
||
```
|
||
|
||
示例代码:
|
||
```python
|
||
# 无参数无返回值的函数
|
||
def say_hello():
|
||
print("Hello, World!")
|
||
|
||
# 有参数有返回值的函数
|
||
def add(a, b):
|
||
return a + b
|
||
|
||
# 调用函数
|
||
say_hello() # 输出:Hello, World!
|
||
result = add(3, 5)
|
||
print(result) # 输出:8
|
||
```
|
||
|
||
### 23.2 函数的参数
|
||
1. 位置参数:
|
||
```python
|
||
def greet(name, age):
|
||
print(f"你好,{name},你今年{age}岁了")
|
||
|
||
greet("张三", 18) # 参数按顺序传递
|
||
```
|
||
|
||
2. 默认参数:
|
||
```python
|
||
def greet(name, age=18):
|
||
print(f"你好,{name},你今年{age}岁了")
|
||
|
||
greet("张三") # 使用默认年龄
|
||
greet("李四", 20) # 覆盖默认年龄
|
||
```
|
||
|
||
3. 关键字参数:
|
||
```python
|
||
def greet(name, age):
|
||
print(f"你好,{name},你今年{age}岁了")
|
||
|
||
greet(age=20, name="王五") # 使用参数名指定值
|
||
```
|
||
|
||
4. 可变参数:
|
||
```python
|
||
# *args:接收任意数量的位置参数
|
||
def sum_numbers(*args):
|
||
return sum(args)
|
||
|
||
print(sum_numbers(1, 2, 3, 4)) # 输出:10
|
||
|
||
# **kwargs:接收任意数量的关键字参数
|
||
def print_info(**kwargs):
|
||
for key, value in kwargs.items():
|
||
print(f"{key}: {value}")
|
||
|
||
print_info(name="张三", age=18, city="北京")
|
||
```
|
||
|
||
### 23.3 函数的返回值
|
||
1. 单个返回值:
|
||
```python
|
||
def square(x):
|
||
return x * x
|
||
|
||
result = square(5)
|
||
print(result) # 输出:25
|
||
```
|
||
|
||
2. 多个返回值:
|
||
```python
|
||
def get_circle_info(radius):
|
||
area = 3.14 * radius * radius
|
||
perimeter = 2 * 3.14 * radius
|
||
return area, perimeter
|
||
|
||
area, perimeter = get_circle_info(5)
|
||
print(f"面积:{area}, 周长:{perimeter}")
|
||
```
|
||
|
||
3. 无返回值:
|
||
```python
|
||
def print_message():
|
||
print("这是一个消息")
|
||
# 没有return语句,默认返回None
|
||
```
|
||
|
||
### 23.4 函数的作用域
|
||
1. 局部变量:
|
||
```python
|
||
def test():
|
||
x = 10 # 局部变量
|
||
print(x)
|
||
|
||
test()
|
||
# print(x) # 错误:x未定义
|
||
```
|
||
|
||
2. 全局变量:
|
||
```python
|
||
x = 100 # 全局变量
|
||
|
||
def test():
|
||
print(x) # 可以访问全局变量
|
||
|
||
test()
|
||
print(x) # 可以访问全局变量
|
||
```
|
||
|
||
3. global关键字:
|
||
```python
|
||
x = 100
|
||
|
||
def test():
|
||
global x # 声明使用全局变量
|
||
x = 200 # 修改全局变量
|
||
print(x)
|
||
|
||
test()
|
||
print(x) # 输出:200
|
||
```
|
||
|
||
### 23.5 函数的高级特性
|
||
1. 函数作为参数:
|
||
```python
|
||
def apply_operation(x, y, operation):
|
||
return operation(x, y)
|
||
|
||
def add(a, b):
|
||
return a + b
|
||
|
||
def multiply(a, b):
|
||
return a * b
|
||
|
||
print(apply_operation(5, 3, add)) # 输出:8
|
||
print(apply_operation(5, 3, multiply)) # 输出:15
|
||
```
|
||
|
||
2. lambda表达式:
|
||
```python
|
||
# 使用lambda定义匿名函数
|
||
square = lambda x: x * x
|
||
print(square(5)) # 输出:25
|
||
|
||
# 在函数中使用lambda
|
||
numbers = [1, 2, 3, 4, 5]
|
||
squared = list(map(lambda x: x * x, numbers))
|
||
print(squared) # 输出:[1, 4, 9, 16, 25]
|
||
```
|
||
|
||
3. 函数装饰器:
|
||
```python
|
||
def log_function_call(func):
|
||
def wrapper(*args, **kwargs):
|
||
print(f"调用函数:{func.__name__}")
|
||
return func(*args, **kwargs)
|
||
return wrapper
|
||
|
||
@log_function_call
|
||
def add(a, b):
|
||
return a + b
|
||
|
||
print(add(3, 5)) # 输出:调用函数:add 8
|
||
```
|
||
|
||
## Day 24: 函数进阶应用
|
||
|
||
### 24.1 递归函数
|
||
- 递归是函数调用自身的过程
|
||
- 递归函数必须包含基本情况(终止条件)和递归情况
|
||
|
||
示例代码:
|
||
```python
|
||
# 计算阶乘
|
||
def factorial(n):
|
||
if n == 0 or n == 1: # 基本情况
|
||
return 1
|
||
else: # 递归情况
|
||
return n * factorial(n - 1)
|
||
|
||
print(factorial(5)) # 输出:120
|
||
|
||
# 斐波那契数列
|
||
def fibonacci(n):
|
||
if n <= 1: # 基本情况
|
||
return n
|
||
else: # 递归情况
|
||
return fibonacci(n-1) + fibonacci(n-2)
|
||
|
||
print(fibonacci(10)) # 输出:55
|
||
```
|
||
|
||
### 24.2 闭包
|
||
- 闭包是一个函数,它记住了创建时的环境变量
|
||
- 闭包可以访问外部函数的变量
|
||
|
||
示例代码:
|
||
```python
|
||
def create_counter():
|
||
count = 0 # 外部函数的变量
|
||
|
||
def counter():
|
||
nonlocal count # 声明使用外部变量
|
||
count += 1
|
||
return count
|
||
|
||
return counter
|
||
|
||
# 创建计数器
|
||
counter = create_counter()
|
||
print(counter()) # 输出:1
|
||
print(counter()) # 输出:2
|
||
print(counter()) # 输出:3
|
||
```
|
||
|
||
### 24.3 生成器函数
|
||
- 使用yield关键字创建生成器
|
||
- 生成器可以逐个产生值,而不是一次性生成所有值
|
||
|
||
示例代码:
|
||
```python
|
||
def number_generator(n):
|
||
for i in range(n):
|
||
yield i
|
||
|
||
# 使用生成器
|
||
gen = number_generator(5)
|
||
for num in gen:
|
||
print(num) # 输出:0 1 2 3 4
|
||
|
||
# 生成器表达式
|
||
squares = (x*x for x in range(5))
|
||
print(list(squares)) # 输出:[0, 1, 4, 9, 16]
|
||
```
|
||
|
||
### 24.4 函数式编程
|
||
1. map函数:
|
||
```python
|
||
# 将函数应用于可迭代对象的每个元素
|
||
numbers = [1, 2, 3, 4, 5]
|
||
squared = list(map(lambda x: x**2, numbers))
|
||
print(squared) # 输出:[1, 4, 9, 16, 25]
|
||
```
|
||
|
||
2. filter函数:
|
||
```python
|
||
# 过滤可迭代对象中的元素
|
||
numbers = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
|
||
even_numbers = list(filter(lambda x: x % 2 == 0, numbers))
|
||
print(even_numbers) # 输出:[2, 4, 6, 8, 10]
|
||
```
|
||
|
||
3. reduce函数:
|
||
```python
|
||
from functools import reduce
|
||
|
||
# 将函数应用于可迭代对象的所有元素,返回单个值
|
||
numbers = [1, 2, 3, 4, 5]
|
||
product = reduce(lambda x, y: x * y, numbers)
|
||
print(product) # 输出:120
|
||
```
|
||
|
||
### 24.5 函数的高级应用
|
||
1. 函数缓存:
|
||
```python
|
||
from functools import lru_cache
|
||
|
||
@lru_cache(maxsize=128)
|
||
def fibonacci(n):
|
||
if n <= 1:
|
||
return n
|
||
return fibonacci(n-1) + fibonacci(n-2)
|
||
|
||
print(fibonacci(10)) # 输出:55
|
||
```
|
||
|
||
2. 函数参数检查:
|
||
```python
|
||
def validate_input(func):
|
||
def wrapper(*args, **kwargs):
|
||
for arg in args:
|
||
if not isinstance(arg, (int, float)):
|
||
raise TypeError("参数必须是数字")
|
||
return func(*args, **kwargs)
|
||
return wrapper
|
||
|
||
@validate_input
|
||
def add(a, b):
|
||
return a + b
|
||
|
||
print(add(1, 2)) # 输出:3
|
||
# print(add("1", 2)) # 引发TypeError
|
||
```
|
||
|
||
3. 函数计时器:
|
||
```python
|
||
import time
|
||
|
||
def timer(func):
|
||
def wrapper(*args, **kwargs):
|
||
start_time = time.time()
|
||
result = func(*args, **kwargs)
|
||
end_time = time.time()
|
||
print(f"函数 {func.__name__} 执行时间:{end_time - start_time:.4f} 秒")
|
||
return result
|
||
return wrapper
|
||
|
||
@timer
|
||
def slow_function():
|
||
time.sleep(1)
|
||
return "完成"
|
||
|
||
print(slow_function()) # 输出:函数 slow_function 执行时间:1.0000 秒
|
||
```
|
||
|
||
### 24.6 函数的最佳实践
|
||
1. 函数命名规范:
|
||
```python
|
||
# 使用小写字母和下划线
|
||
def calculate_average():
|
||
pass
|
||
|
||
# 动词开头
|
||
def get_user_info():
|
||
pass
|
||
|
||
# 描述性名称
|
||
def convert_temperature():
|
||
pass
|
||
```
|
||
|
||
2. 函数文档字符串:
|
||
```python
|
||
def calculate_circle_area(radius):
|
||
"""
|
||
计算圆的面积
|
||
|
||
参数:
|
||
radius (float): 圆的半径
|
||
|
||
返回:
|
||
float: 圆的面积
|
||
"""
|
||
return 3.14 * radius * radius
|
||
```
|
||
|
||
3. 函数参数默认值:
|
||
```python
|
||
def create_user(name, age=18, city="北京"):
|
||
"""
|
||
创建用户信息
|
||
|
||
参数:
|
||
name (str): 用户名
|
||
age (int, optional): 年龄,默认为18
|
||
city (str, optional): 城市,默认为北京
|
||
"""
|
||
return {"name": name, "age": age, "city": city}
|
||
```
|
||
|
||
## Day 25: 模块和包
|
||
|
||
### 25.1 模块的概念
|
||
- 模块是一个包含Python代码的文件
|
||
- 模块可以包含函数、类和变量
|
||
- 使用模块可以组织代码,提高代码的复用性
|
||
|
||
示例代码:
|
||
```python
|
||
# math_operations.py
|
||
def add(a, b):
|
||
return a + b
|
||
|
||
def subtract(a, b):
|
||
return a - b
|
||
|
||
def multiply(a, b):
|
||
return a * b
|
||
|
||
def divide(a, b):
|
||
if b == 0:
|
||
raise ValueError("除数不能为0")
|
||
return a / b
|
||
```
|
||
|
||
### 25.2 导入模块
|
||
1. 导入整个模块:
|
||
```python
|
||
import math_operations
|
||
|
||
result = math_operations.add(5, 3)
|
||
print(result) # 输出:8
|
||
```
|
||
|
||
2. 导入特定函数:
|
||
```python
|
||
from math_operations import add, subtract
|
||
|
||
result = add(5, 3)
|
||
print(result) # 输出:8
|
||
```
|
||
|
||
3. 使用别名:
|
||
```python
|
||
import math_operations as mo
|
||
from math_operations import add as addition
|
||
|
||
result = mo.multiply(5, 3)
|
||
print(result) # 输出:15
|
||
|
||
sum_result = addition(5, 3)
|
||
print(sum_result) # 输出:8
|
||
```
|
||
|
||
### 25.3 内置模块
|
||
1. math模块:
|
||
```python
|
||
import math
|
||
|
||
print(math.pi) # 输出:3.141592653589793
|
||
print(math.sqrt(16)) # 输出:4.0
|
||
print(math.pow(2, 3)) # 输出:8.0
|
||
```
|
||
|
||
2. random模块:
|
||
```python
|
||
import random
|
||
|
||
print(random.random()) # 输出:0到1之间的随机数
|
||
print(random.randint(1, 10)) # 输出:1到10之间的随机整数
|
||
print(random.choice(['apple', 'banana', 'orange'])) # 随机选择一个元素
|
||
```
|
||
|
||
3. datetime模块:
|
||
```python
|
||
from datetime import datetime, timedelta
|
||
|
||
now = datetime.now()
|
||
print(now) # 输出当前时间
|
||
|
||
future = now + timedelta(days=7)
|
||
print(future) # 输出7天后的时间
|
||
```
|
||
|
||
### 25.4 包的概念
|
||
- 包是一个包含多个模块的目录
|
||
- 包必须包含一个`__init__.py`文件
|
||
- 包可以组织相关的模块
|
||
|
||
示例结构:
|
||
```
|
||
my_package/
|
||
__init__.py
|
||
math_operations.py
|
||
string_operations.py
|
||
utils.py
|
||
```
|
||
|
||
### 25.5 创建和使用包
|
||
1. 创建包:
|
||
```python
|
||
# my_package/__init__.py
|
||
from .math_operations import add, subtract
|
||
from .string_operations import reverse_string
|
||
|
||
# my_package/math_operations.py
|
||
def add(a, b):
|
||
return a + b
|
||
|
||
def subtract(a, b):
|
||
return a - b
|
||
|
||
# my_package/string_operations.py
|
||
def reverse_string(text):
|
||
return text[::-1]
|
||
```
|
||
|
||
2. 使用包:
|
||
```python
|
||
from my_package import add, reverse_string
|
||
|
||
print(add(5, 3)) # 输出:8
|
||
print(reverse_string("Hello")) # 输出:olleH
|
||
```
|
||
|
||
### 25.6 模块和包的最佳实践
|
||
1. 模块命名规范:
|
||
```python
|
||
# 使用小写字母和下划线
|
||
math_operations.py
|
||
string_utils.py
|
||
data_processing.py
|
||
```
|
||
|
||
2. 包的结构:
|
||
```
|
||
project/
|
||
package1/
|
||
__init__.py
|
||
module1.py
|
||
module2.py
|
||
package2/
|
||
__init__.py
|
||
module3.py
|
||
module4.py
|
||
main.py
|
||
```
|
||
|
||
3. 相对导入:
|
||
```python
|
||
# 在包内使用相对导入
|
||
from .module1 import function1
|
||
from ..package2.module3 import function3
|
||
```
|
||
|
||
4. 模块文档:
|
||
```python
|
||
"""
|
||
这是一个数学运算模块
|
||
|
||
这个模块提供了基本的数学运算功能,包括:
|
||
- 加法
|
||
- 减法
|
||
- 乘法
|
||
- 除法
|
||
"""
|
||
|
||
def add(a, b):
|
||
"""
|
||
计算两个数的和
|
||
|
||
参数:
|
||
a (int/float): 第一个数
|
||
b (int/float): 第二个数
|
||
|
||
返回:
|
||
int/float: 两个数的和
|
||
"""
|
||
return a + b
|
||
```
|
||
|
||
### 25.7 常用第三方包
|
||
1. requests:HTTP请求
|
||
```python
|
||
import requests
|
||
|
||
response = requests.get('https://api.example.com/data')
|
||
print(response.json())
|
||
```
|
||
|
||
2. pandas:数据处理
|
||
```python
|
||
import pandas as pd
|
||
|
||
df = pd.DataFrame({
|
||
'name': ['张三', '李四', '王五'],
|
||
'age': [20, 25, 30]
|
||
})
|
||
print(df)
|
||
```
|
||
|
||
3. numpy:科学计算
|
||
```python
|
||
import numpy as np
|
||
|
||
arr = np.array([1, 2, 3, 4, 5])
|
||
print(arr.mean()) # 计算平均值
|
||
print(arr.std()) # 计算标准差
|
||
```
|
||
|
||
## Day 26: 面向对象编程基础
|
||
|
||
### 26.1 类和对象的概念
|
||
- 类是一个模板,用于创建对象
|
||
- 对象是类的实例,具有属性和方法
|
||
- 属性是对象的特征
|
||
- 方法是对象的行为
|
||
|
||
示例代码:
|
||
```python
|
||
class Person:
|
||
# 类属性
|
||
species = "人类"
|
||
|
||
# 初始化方法
|
||
def __init__(self, name, age):
|
||
# 实例属性
|
||
self.name = name
|
||
self.age = age
|
||
|
||
# 实例方法
|
||
def introduce(self):
|
||
return f"我叫{self.name},今年{self.age}岁"
|
||
|
||
# 创建对象
|
||
person1 = Person("张三", 20)
|
||
person2 = Person("李四", 25)
|
||
|
||
# 访问属性和方法
|
||
print(person1.name) # 输出:张三
|
||
print(person1.introduce()) # 输出:我叫张三,今年20岁
|
||
print(Person.species) # 输出:人类
|
||
```
|
||
|
||
### 26.2 类的属性
|
||
1. 类属性:
|
||
```python
|
||
class Student:
|
||
# 类属性
|
||
school = "第一中学"
|
||
total_students = 0
|
||
|
||
def __init__(self, name):
|
||
self.name = name
|
||
Student.total_students += 1
|
||
|
||
# 访问类属性
|
||
print(Student.school) # 输出:第一中学
|
||
|
||
# 创建对象
|
||
student1 = Student("张三")
|
||
student2 = Student("李四")
|
||
print(Student.total_students) # 输出:2
|
||
```
|
||
|
||
2. 实例属性:
|
||
```python
|
||
class Car:
|
||
def __init__(self, brand, model, year):
|
||
self.brand = brand
|
||
self.model = model
|
||
self.year = year
|
||
self.speed = 0 # 初始速度
|
||
|
||
def accelerate(self):
|
||
self.speed += 10
|
||
|
||
def brake(self):
|
||
self.speed -= 5
|
||
|
||
# 创建对象
|
||
car = Car("丰田", "卡罗拉", 2020)
|
||
print(car.brand) # 输出:丰田
|
||
car.accelerate()
|
||
print(car.speed) # 输出:10
|
||
```
|
||
|
||
### 26.3 类的方法
|
||
1. 实例方法:
|
||
```python
|
||
class Rectangle:
|
||
def __init__(self, width, height):
|
||
self.width = width
|
||
self.height = height
|
||
|
||
def area(self):
|
||
return self.width * self.height
|
||
|
||
def perimeter(self):
|
||
return 2 * (self.width + self.height)
|
||
|
||
rect = Rectangle(5, 3)
|
||
print(rect.area()) # 输出:15
|
||
print(rect.perimeter()) # 输出:16
|
||
```
|
||
|
||
2. 类方法:
|
||
```python
|
||
class MathUtils:
|
||
pi = 3.14159
|
||
|
||
@classmethod
|
||
def circle_area(cls, radius):
|
||
return cls.pi * radius * radius
|
||
|
||
@classmethod
|
||
def circle_perimeter(cls, radius):
|
||
return 2 * cls.pi * radius
|
||
|
||
print(MathUtils.circle_area(5)) # 输出:78.53975
|
||
```
|
||
|
||
3. 静态方法:
|
||
```python
|
||
class StringUtils:
|
||
@staticmethod
|
||
def is_palindrome(text):
|
||
return text == text[::-1]
|
||
|
||
@staticmethod
|
||
def count_words(text):
|
||
return len(text.split())
|
||
|
||
print(StringUtils.is_palindrome("level")) # 输出:True
|
||
print(StringUtils.count_words("Hello World")) # 输出:2
|
||
```
|
||
|
||
### 26.4 封装
|
||
1. 私有属性和方法:
|
||
```python
|
||
class BankAccount:
|
||
def __init__(self, account_number, balance):
|
||
self.__account_number = account_number # 私有属性
|
||
self.__balance = balance
|
||
|
||
def __validate_amount(self, amount): # 私有方法
|
||
return amount > 0
|
||
|
||
def deposit(self, amount):
|
||
if self.__validate_amount(amount):
|
||
self.__balance += amount
|
||
return True
|
||
return False
|
||
|
||
def get_balance(self):
|
||
return self.__balance
|
||
|
||
account = BankAccount("12345", 1000)
|
||
account.deposit(500)
|
||
print(account.get_balance()) # 输出:1500
|
||
```
|
||
|
||
2. 属性装饰器:
|
||
```python
|
||
class Person:
|
||
def __init__(self, name, age):
|
||
self.__name = name
|
||
self.__age = age
|
||
|
||
@property
|
||
def name(self):
|
||
return self.__name
|
||
|
||
@name.setter
|
||
def name(self, value):
|
||
if not isinstance(value, str):
|
||
raise ValueError("名字必须是字符串")
|
||
self.__name = value
|
||
|
||
@property
|
||
def age(self):
|
||
return self.__age
|
||
|
||
@age.setter
|
||
def age(self, value):
|
||
if not isinstance(value, int) or value < 0:
|
||
raise ValueError("年龄必须是正整数")
|
||
self.__age = value
|
||
|
||
person = Person("张三", 20)
|
||
print(person.name) # 输出:张三
|
||
person.name = "李四"
|
||
print(person.name) # 输出:李四
|
||
```
|
||
|
||
### 26.5 继承
|
||
1. 单继承:
|
||
```python
|
||
class Animal:
|
||
def __init__(self, name):
|
||
self.name = name
|
||
|
||
def speak(self):
|
||
pass
|
||
|
||
class Dog(Animal):
|
||
def speak(self):
|
||
return f"{self.name}说:汪汪!"
|
||
|
||
class Cat(Animal):
|
||
def speak(self):
|
||
return f"{self.name}说:喵喵!"
|
||
|
||
dog = Dog("旺财")
|
||
cat = Cat("咪咪")
|
||
print(dog.speak()) # 输出:旺财说:汪汪!
|
||
print(cat.speak()) # 输出:咪咪说:喵喵!
|
||
```
|
||
|
||
2. 多继承:
|
||
```python
|
||
class Flyable:
|
||
def fly(self):
|
||
return "我能飞"
|
||
|
||
class Swimmable:
|
||
def swim(self):
|
||
return "我能游泳"
|
||
|
||
class Duck(Flyable, Swimmable):
|
||
def __init__(self, name):
|
||
self.name = name
|
||
|
||
def speak(self):
|
||
return f"{self.name}说:嘎嘎!"
|
||
|
||
duck = Duck("唐老鸭")
|
||
print(duck.speak()) # 输出:唐老鸭说:嘎嘎!
|
||
print(duck.fly()) # 输出:我能飞
|
||
print(duck.swim()) # 输出:我能游泳
|
||
```
|
||
|
||
### 26.6 多态
|
||
```python
|
||
class Shape:
|
||
def area(self):
|
||
pass
|
||
|
||
class Circle(Shape):
|
||
def __init__(self, radius):
|
||
self.radius = radius
|
||
|
||
def area(self):
|
||
return 3.14 * self.radius * self.radius
|
||
|
||
class Rectangle(Shape):
|
||
def __init__(self, width, height):
|
||
self.width = width
|
||
self.height = height
|
||
|
||
def area(self):
|
||
return self.width * self.height
|
||
|
||
def print_area(shape):
|
||
print(f"面积是:{shape.area()}")
|
||
|
||
# 多态示例
|
||
circle = Circle(5)
|
||
rectangle = Rectangle(4, 6)
|
||
|
||
print_area(circle) # 输出:面积是:78.5
|
||
print_area(rectangle) # 输出:面积是:24
|
||
```
|
||
|
||
## Day 27: 面向对象编程进阶
|
||
|
||
### 27.1 抽象类和接口
|
||
1. 抽象类:
|
||
```python
|
||
from abc import ABC, abstractmethod
|
||
|
||
class Shape(ABC):
|
||
@abstractmethod
|
||
def area(self):
|
||
pass
|
||
|
||
@abstractmethod
|
||
def perimeter(self):
|
||
pass
|
||
|
||
class Circle(Shape):
|
||
def __init__(self, radius):
|
||
self.radius = radius
|
||
|
||
def area(self):
|
||
return 3.14 * self.radius * self.radius
|
||
|
||
def perimeter(self):
|
||
return 2 * 3.14 * self.radius
|
||
|
||
# 不能直接实例化抽象类
|
||
# shape = Shape() # 会报错
|
||
|
||
circle = Circle(5)
|
||
print(circle.area()) # 输出:78.5
|
||
```
|
||
|
||
2. 接口(通过抽象类实现):
|
||
```python
|
||
from abc import ABC, abstractmethod
|
||
|
||
class PaymentMethod(ABC):
|
||
@abstractmethod
|
||
def pay(self, amount):
|
||
pass
|
||
|
||
class CreditCard(PaymentMethod):
|
||
def pay(self, amount):
|
||
return f"使用信用卡支付{amount}元"
|
||
|
||
class Alipay(PaymentMethod):
|
||
def pay(self, amount):
|
||
return f"使用支付宝支付{amount}元"
|
||
|
||
# 使用接口
|
||
def process_payment(payment_method, amount):
|
||
return payment_method.pay(amount)
|
||
|
||
card = CreditCard()
|
||
alipay = Alipay()
|
||
|
||
print(process_payment(card, 100)) # 输出:使用信用卡支付100元
|
||
print(process_payment(alipay, 200)) # 输出:使用支付宝支付200元
|
||
```
|
||
|
||
### 27.2 魔术方法
|
||
1. 基本魔术方法:
|
||
```python
|
||
class Person:
|
||
def __init__(self, name, age):
|
||
self.name = name
|
||
self.age = age
|
||
|
||
def __str__(self):
|
||
return f"Person(name={self.name}, age={self.age})"
|
||
|
||
def __repr__(self):
|
||
return f"Person('{self.name}', {self.age})"
|
||
|
||
def __len__(self):
|
||
return len(self.name)
|
||
|
||
def __bool__(self):
|
||
return self.age >= 18
|
||
|
||
person = Person("张三", 20)
|
||
print(str(person)) # 输出:Person(name=张三, age=20)
|
||
print(repr(person)) # 输出:Person('张三', 20)
|
||
print(len(person)) # 输出:2
|
||
print(bool(person)) # 输出:True
|
||
```
|
||
|
||
2. 运算符魔术方法:
|
||
```python
|
||
class Vector:
|
||
def __init__(self, x, y):
|
||
self.x = x
|
||
self.y = y
|
||
|
||
def __add__(self, other):
|
||
return Vector(self.x + other.x, self.y + other.y)
|
||
|
||
def __sub__(self, other):
|
||
return Vector(self.x - other.x, self.y - other.y)
|
||
|
||
def __mul__(self, scalar):
|
||
return Vector(self.x * scalar, self.y * scalar)
|
||
|
||
def __str__(self):
|
||
return f"Vector({self.x}, {self.y})"
|
||
|
||
v1 = Vector(1, 2)
|
||
v2 = Vector(3, 4)
|
||
|
||
print(v1 + v2) # 输出:Vector(4, 6)
|
||
print(v2 - v1) # 输出:Vector(2, 2)
|
||
print(v1 * 2) # 输出:Vector(2, 4)
|
||
```
|
||
|
||
### 27.3 描述符
|
||
1. 属性描述符:
|
||
```python
|
||
class ValidString:
|
||
def __init__(self, minlen=0, maxlen=None):
|
||
self.minlen = minlen
|
||
self.maxlen = maxlen
|
||
|
||
def __get__(self, instance, owner):
|
||
return instance.__dict__.get(self.name)
|
||
|
||
def __set__(self, instance, value):
|
||
if not isinstance(value, str):
|
||
raise TypeError("值必须是字符串")
|
||
if len(value) < self.minlen:
|
||
raise ValueError(f"字符串长度不能小于{self.minlen}")
|
||
if self.maxlen and len(value) > self.maxlen:
|
||
raise ValueError(f"字符串长度不能大于{self.maxlen}")
|
||
instance.__dict__[self.name] = value
|
||
|
||
def __set_name__(self, owner, name):
|
||
self.name = name
|
||
|
||
class User:
|
||
name = ValidString(minlen=2, maxlen=20)
|
||
email = ValidString(minlen=5, maxlen=50)
|
||
|
||
def __init__(self, name, email):
|
||
self.name = name
|
||
self.email = email
|
||
|
||
user = User("张三", "zhangsan@example.com")
|
||
print(user.name) # 输出:张三
|
||
print(user.email) # 输出:zhangsan@example.com
|
||
```
|
||
|
||
### 27.4 元类
|
||
1. 基本元类:
|
||
```python
|
||
class MetaLogger(type):
|
||
def __new__(cls, name, bases, attrs):
|
||
print(f"创建类:{name}")
|
||
return super().__new__(cls, name, bases, attrs)
|
||
|
||
def __init__(cls, name, bases, attrs):
|
||
print(f"初始化类:{name}")
|
||
super().__init__(name, bases, attrs)
|
||
|
||
class MyClass(metaclass=MetaLogger):
|
||
def __init__(self):
|
||
print("初始化实例")
|
||
|
||
# 创建类时会打印日志
|
||
obj = MyClass()
|
||
```
|
||
|
||
2. 单例模式:
|
||
```python
|
||
class Singleton(type):
|
||
_instances = {}
|
||
|
||
def __call__(cls, *args, **kwargs):
|
||
if cls not in cls._instances:
|
||
cls._instances[cls] = super().__call__(*args, **kwargs)
|
||
return cls._instances[cls]
|
||
|
||
class Database(metaclass=Singleton):
|
||
def __init__(self):
|
||
print("初始化数据库连接")
|
||
|
||
def query(self, sql):
|
||
return f"执行SQL:{sql}"
|
||
|
||
# 创建多个实例,但只会初始化一次
|
||
db1 = Database()
|
||
db2 = Database()
|
||
print(db1 is db2) # 输出:True
|
||
```
|
||
|
||
### 27.5 设计模式
|
||
1. 工厂模式:
|
||
```python
|
||
class Animal:
|
||
def speak(self):
|
||
pass
|
||
|
||
class Dog(Animal):
|
||
def speak(self):
|
||
return "汪汪!"
|
||
|
||
class Cat(Animal):
|
||
def speak(self):
|
||
return "喵喵!"
|
||
|
||
class AnimalFactory:
|
||
@staticmethod
|
||
def create_animal(animal_type):
|
||
if animal_type == "dog":
|
||
return Dog()
|
||
elif animal_type == "cat":
|
||
return Cat()
|
||
else:
|
||
raise ValueError("未知的动物类型")
|
||
|
||
# 使用工厂创建对象
|
||
factory = AnimalFactory()
|
||
dog = factory.create_animal("dog")
|
||
cat = factory.create_animal("cat")
|
||
|
||
print(dog.speak()) # 输出:汪汪!
|
||
print(cat.speak()) # 输出:喵喵!
|
||
```
|
||
|
||
2. 观察者模式:
|
||
```python
|
||
class Subject:
|
||
def __init__(self):
|
||
self._observers = []
|
||
|
||
def attach(self, observer):
|
||
self._observers.append(observer)
|
||
|
||
def detach(self, observer):
|
||
self._observers.remove(observer)
|
||
|
||
def notify(self, message):
|
||
for observer in self._observers:
|
||
observer.update(message)
|
||
|
||
class Observer:
|
||
def update(self, message):
|
||
pass
|
||
|
||
class NewsAgency(Subject):
|
||
def publish_news(self, news):
|
||
self.notify(news)
|
||
|
||
class NewsChannel(Observer):
|
||
def __init__(self, name):
|
||
self.name = name
|
||
|
||
def update(self, message):
|
||
print(f"{self.name}收到新闻:{message}")
|
||
|
||
# 使用观察者模式
|
||
agency = NewsAgency()
|
||
channel1 = NewsChannel("CCTV")
|
||
channel2 = NewsChannel("BBC")
|
||
|
||
agency.attach(channel1)
|
||
agency.attach(channel2)
|
||
|
||
agency.publish_news("重大新闻!")
|
||
```
|
||
|
||
### 27.6 最佳实践
|
||
1. 组合优于继承:
|
||
```python
|
||
class Engine:
|
||
def start(self):
|
||
return "引擎启动"
|
||
|
||
class Wheel:
|
||
def rotate(self):
|
||
return "轮子转动"
|
||
|
||
class Car:
|
||
def __init__(self):
|
||
self.engine = Engine()
|
||
self.wheels = [Wheel() for _ in range(4)]
|
||
|
||
def start(self):
|
||
return self.engine.start()
|
||
|
||
def drive(self):
|
||
return [wheel.rotate() for wheel in self.wheels]
|
||
|
||
car = Car()
|
||
print(car.start()) # 输出:引擎启动
|
||
print(car.drive()) # 输出:['轮子转动', '轮子转动', '轮子转动', '轮子转动']
|
||
```
|
||
|
||
2. 依赖注入:
|
||
```python
|
||
class Database:
|
||
def query(self, sql):
|
||
return f"执行SQL:{sql}"
|
||
|
||
class UserService:
|
||
def __init__(self, database):
|
||
self.database = database
|
||
|
||
def get_user(self, user_id):
|
||
return self.database.query(f"SELECT * FROM users WHERE id = {user_id}")
|
||
|
||
# 使用依赖注入
|
||
db = Database()
|
||
user_service = UserService(db)
|
||
print(user_service.get_user(1))
|
||
``` |