定义变量
标识符
由数字、字⺟、下划线组成
不能数字开头
不能使⽤内置关键字
严格区分⼤⼩写
BUG
Debugger:显示变量和变量的细节
Console:输出内容
数据类型
格式化输出
注:
f’{表达式}'的用法
print(f'我的名字是{name}, 我今年{age}岁.')
转义字符
结束符
在Python中,print(), 默认⾃带 end=“\n” 这个换⾏结束符,所以导致每两个 print 直接会换⾏展示,⽤户可以按需求更改结束符
# 默认以换行结束
print('Hello', end='\n')
# 以制表符结束
print('World', end='\t')
# 自定义结束
print('Hi', end='...')
print('python')
语法
input("提示信息")
特点
转换数据类型的函数
函数 | 说明 |
---|---|
int(x [,base]) | 将x转换为⼀个整数 |
float(x) | 将x转换为⼀个浮点数 |
str(x) | 将对象 x 转换为字符串 |
eval(str) | ⽤来计算在字符串中的有效Python表达式,并返回⼀个对象(转换成原本类型) |
tuple(s) | 将序列 s 转换为⼀个元组 |
list(s) | 将序列 s 转换为⼀个列表 |
代码示例
# 转换成浮点型
num1 = 10
print(float(num1))
# 转换成字符串类型
num2 = 110
print(type(str(num2)))
# 转换成元组类型
list1 = [10, 9, 8]
print(tuple(list1))
print(type(tuple(list1)))
# 将字符串转换成原本形式
print('.............')
str1 = '10'
str2 = '[1, 2, 3]'
str3 = '(1000, 2000, 3000)'
print(type(eval(str1)))
print(type(eval(str2)))
print(type(eval(str3)))
算数运算符
+,-,*,/,//(整除),%,**(指数),()
注:混合运算优先级顺序: () ⾼于 ** ⾼于 * / // % ⾼于 + -
赋值运算符
运算符 | 描述 | 赋值实例 |
---|---|---|
= | 赋值 | 将=右侧的结果赋值给等号左侧的变量 |
复合赋值运算符
运算符 | 描述 |
---|---|
+= | 加法赋值运算符 |
-= | 减法赋值运算符 |
*= | 乘法赋值运算符 |
/= | 除法赋值运算符 |
//= | 整除赋值运算符 |
%= | 取余赋值运算符 |
**= | 幂赋值运算符 |
注:先算赋值运算符右边的表达式,再算赋值运算符
d = 10
d *= 1 + 2
# 结果为30
比较运算符
运 算 符 | 描述 |
---|---|
== | 判断相等。如果两个操作数的结果相等,则条件结 果为真(True),否则条件结果为假(False) |
!= | 不等于 。如果两个操作数的结果不相等,则条件为 真(True),否则条件结果为假(False) |
> | 运算符左侧操作数结果是否⼤于右侧操作数结果, 如果⼤于,则条件为真,否则为假 |
< | 运算符左侧操作数结果是否⼩于右侧操作数结果, 如果⼩于,则条件为真,否则为假 |
>= | 运算符左侧操作数结果是否⼤于等于右侧操作数结 果,如果⼤于,则条件为真,否则为假 |
<= | 运算符左侧操作数结果是否⼩于等于右侧操作数结 果,如果⼩于,则条件为真,否则为假 |
逻辑运算符
运 算 符 | 描述 | |
---|---|---|
and | x and y | 布尔"与":如果 x 为 False,x and y 返回 False,否则它返回 y 的值。 |
or | x or y | 布尔"或":如果 x 是 True,它返回 True,否则 它返回 y 的值。 |
not | not x | 布尔"⾮":如果 x 为 True,返回 False 。如果 x 为 False,它返回 True。 |
代码示例
a = 1
b = 2
c = 3
print((a < b) and (b < c)) # True
print((a > b) and (b < c)) # False
print((a > b) or (b < c)) # True
print(not (a > b)) # True
数字之间的逻辑运算
a = 0
b = 1
c = 2
# and运算符,只要有⼀个值为0,则结果为0,否则结果为最后⼀个⾮0数字
print(a and b) # 0
print(b and a) # 0
print(a and c) # 0
print(c and a) # 0
print(b and c) # 2
print(c and b) # 1
# or运算符,只有所有值为0结果才为0,否则结果为第⼀个⾮0数字
print(a or b) # 1
print(a or c) # 2
print(b or c) # 1
if 语法
if 条件:
条件成⽴执⾏的代码1
条件成⽴执⾏的代码2
......
代码示例
if True:
print('条件成⽴执⾏的代码')
# 下⽅的代码没有缩进到if语句块,所以和if条件⽆关
print('我是⽆论条件是否成⽴都要执⾏的代码')
if…else…
# 注意input接收的数据类型是字符串类型需要转换
age = int(input('请输入你的年龄:'))
if age >= 18:
print(f'您的年龄为{age},已成年')
else:
print('你还未成年,滚去学习吧!')
多重判断
语法
if 条件1:
条件1成⽴执⾏的代码1
条件1成⽴执⾏的代码2
......
elif 条件2:
条件2成⽴执⾏的代码1
条件2成⽴执⾏的代码2
......
......
else:
以上条件都不成⽴执⾏执⾏的代码
注:多重判断也可以和else配合使⽤。⼀般else放到整个if语句的最后,表示以上条件都不成⽴的时候执⾏的代码
代码示例
# 输入年龄
age = int(input('请输入你的年龄:'))
# 进行判断
if age < 18:
print(f'你的年龄为{age},未成年。')
# (age >= 18) and (age < 60):
elif 18 <= age < 60:
print((f'你的年龄为{age},已成年还未退休。'))
else:
print(f'你的年龄为{age},已退休。')
if嵌套
语法
if 条件1:
条件1成⽴执⾏的代码
条件1成⽴执⾏的代码
if 条件2:
条件2成⽴执⾏的代码
条件2成⽴执⾏的代码
应用
import random
'''
猜拳小游戏
0-石头
1-剪刀
2-布
'''
# 电脑随机出拳
pc = random.randint(0, 2)
print(pc)
# 玩家出拳
player = int(input('请出拳:0-⽯头,1-剪⼑,2-布:'))
# 玩家胜利
if((player == 0) and (pc == 1)) or ((player == 1) and (pc == 2)) or ((player == 2) and (pc == 0) ):
print('玩家获胜')
elif player == pc:
print('平局')
else:
print('电脑获胜')
while循环
语法
while 条件:
条件成⽴重复执⾏的代码1
条件成⽴重复执⾏的代码2
......
应用
break和continue
while循环嵌套
语法
while 条件1:
条件1成⽴执⾏的代码
......
while 条件2:
条件2成⽴执⾏的代码
......
总结:所谓while循环嵌套,就是⼀个while⾥⾯嵌套⼀个while的写法,每个while和之前的基础 语法是相同的。
应用:打印99乘法表
# 重复打印9⾏表达式
j = 1
while j <= 9:
# 打印⼀⾏⾥⾯的表达式 a * b = a*b
i = 1
while i <= j:
print(f'{i}*{j}={j*i}', end='\t')
i += 1
print()
j += 1
for循环
语法
for 临时变量 in 序列:
重复执⾏的代码1
重复执⾏的代码2
......
else
while…else
while 条件:
条件成⽴重复执⾏的代码
else:
循环正常结束之后要执⾏的代码
退出循环的方式
break
continue
for…else
for 临时变量 in 序列:
重复执⾏的代码
...
else:
循环正常结束之后要执⾏的代码
字符串特征
# 单引号
name1 = 'Tom'
print(name1)
# 双引号
name2 = "Bob"
print(name2)
# 三引号
str1 = '''Hello World!'''
print(str1)
'''
输出:
Hello
Python!
'''
str2 = """Hello
Python!"""
print(str2)
# 输出:Hello Pop!
str3 = 'Hello ' \
'Pop!'
print(str3)
str4 = 'I\'m Bob' #使用'\'转义
print(str4)
字符串输出:%s
字符串输入:input
下标
切片
概念:切⽚是指对操作的对象截取其中⼀部分的操作。字符串、列表、元组都⽀持切⽚操作。
语法
序列[开始位置下标:结束位置下标:步⻓] # 结束位置不会选取[开始位置下标,结束位置下标)
注
常用操作方法
查找
find():检测某个⼦串是否包含在这个字符串中,如果在返回这个⼦串开始的位置下标,否则则返回-1。
字符串序列.find(⼦串, 开始位置下标, 结束位置下标)
注意:开始和结束位置下标可以省略,表示在整个字符串序列中查找。
index():检测某个⼦串是否包含在这个字符串中,如果在返回这个⼦串开始的位置下标,否则则报异常。
字符串序列.index(⼦串, 开始位置下标, 结束位置下标)
注意:开始和结束位置下标可以省略,表示在整个字符串序列中查找。
3. rfind(): 和find()功能相同,但查找⽅向为右侧开始。
4. rindex():和index()功能相同,但查找⽅向为右侧开始。
5. count():返回某个⼦串在字符串中出现的次数
字符串序列.count(⼦串, 开始位置下标, 结束位置下标)
注意:开始和结束位置下标可以省略,表示在整个字符串序列中查找。
修改
replace():替换
字符串序列.replace(旧⼦串, 新⼦串, 替换次数)
注意:数据按照是否能直接修改分为可变类型和不可变类型两种。字符串类型的数据修改的时候 不能改变原有字符串,属于不能直接修改数据的类型即是不可变类型。
split():按照指定字符分割字符串。返回一个列表。
字符串序列.split(分割字符, num)
注意:num表示的是分割字符出现的次数,即将来返回数据个数为num+1个。
注意:如果分割字符是原有字符串中的⼦串,分割后则丢失该⼦串。
join():⽤⼀个字符或⼦串合并字符串,即是将多个字符串合并为⼀个新的字符串。
字符或⼦串.join(多字符串组成的序列)
代码示例
str1 = 'hello and python and world'
# replace
my_str = str1.replace('and', '')
print(my_str) # hello python world
# split 分割,返回一个列表,丢失分割字符
my_list = str1.split('and', 1)
print(my_list) # ['hello ', ' python and world']
# join 合并列表里面的字符串数据为一个大字符串
list1 = ['aa', 'bb', 'cc']
str3 = '...'.join(list1)
print(str3) # aa...bb...cc
capitalize():将字符串第⼀个字符转换成⼤写。
title():将字符串每个单词⾸字⺟转换成⼤写。
lower():将字符串中⼤写转⼩写。
upper():将字符串中⼩写转⼤写。
rstrip():删除字符串右侧空⽩字符。
lstrip():删除字符串左侧空⽩字符。
strip():删除字符串两侧空⽩字符
ljust():返回⼀个原字符串左对⻬,并使⽤指定字符(默认空格)填充⾄对应⻓度的新字符串。
rjust():返回⼀个原字符串右对⻬,并使⽤指定字符(默认空格)填充⾄对应⻓度 的新字符串,语法和 ljust()相同。
center():返回⼀个原字符串居中对⻬,并使⽤指定字符(默认空格)填充⾄对应⻓度 的新字符串,语 法和ljust()相同。
字符串序列.ljust(⻓度, 填充字符) # 表示在该长度内左对齐
判断
startswith():检查字符串是否是以指定⼦串开头,是则返回 True,否则返回 False。如果设置开始和结束位置下标,则在指定范围内检查。
字符串序列.startswith(⼦串, 开始位置下标, 结束位置下标)
endswith()::检查字符串是否是以指定⼦串结尾,是则返回 True,否则返回 False。如果设置开始和结束位置下标,则在指定范围内检查。
字符串序列.endswith(⼦串, 开始位置下标, 结束位置下标)
isalpha():如果字符串⾄少有⼀个字符并且所有字符都是字⺟则返回 True, 否则返回 False。(都是字母)
isdigit():如果字符串只包含数字则返回 True 否则返回 False。(都是数字)
isalnum():如果字符串⾄少有⼀个字符并且所有字符都是字⺟或数字则返 回 True,否则返回 False。(数字或字母或组合)
isspace():如果字符串中只包含空⽩,则返回 True,否则返回 False。(都是空白)
列表
[数据1, 数据2, 数据3, 数据4......]
注:列表可以⼀次性存储多个数据,且可以为不同数据类型。
列表的常用操作
查找
下标
函数
index():返回指定数据所在位置的下标 。
列表序列.index(数据, 开始位置下标, 结束位置下标)
count():统计指定数据在当前列表中出现的次数。
len():访问列表⻓度,即列表中数据的个数。
判断
in:判断指定数据在某个列表序列,如果在返回True,否则返回False
not in:判断指定数据不在某个列表序列,如果不在返回True,否则返回False。
数据 in|not in 列表
增加
append():列表结尾追加数据。
语法
列表序列.extend(数据)
列表追加数据的时候,直接在原列表⾥⾯追加了指定数据,即修改了原列表,故列表为可变类型
数据。注意:如果append()追加的数据是⼀个序列,则追加整个序列到列表
代码示例
name_list = ['Tom', 'Bob', 'Jay']
# 列表为可变类型
name_list.append('liming')
# 结果:['Tom', 'Bob', 'Jay', 'liming']
print(name_list)
name_list.append([11, 110])
# 结果:['Tom', 'Bob', 'Jay', 'liming', [11, 110]]
print(name_list)
extend():列表结尾追加数据,如果数据是⼀个序列,则将这个序列的数据逐⼀添加到列表。
语法
列表序列.extend(数据)
代码示例
name_list = ['Tom', 'Bob', 'Jay']
name_list.extend('Liming')
# 结果:['Tom', 'Bob', 'Jay', 'L', 'i', 'm', 'i', 'n', 'g']
print(name_list)
name_list.extend([10, 20])
# 结果:['Tom', 'Bob', 'Jay', 'L', 'i', 'm', 'i', 'n', 'g', 10, 20]
print(name_list)
insert():指定位置新增数据。
语法
列表序列.insert(位置下标, 数据) # 位置下标从零开始
代码示例
name_list = ['Tom', 'Bob', 'Jay']
name_list.insert(2, 'Liming')
# 结果:['Tom', 'Bob', 'Liming', 'Jay']
print(name_list)
删除
del
pop():删除指定下标的数据(默认为最后⼀个),并返回该数据。
列表序列.pop(下标)
remove():移除列表中某个数据的第⼀个匹配项。
clear():清空列表
name_list = ['Tom', 'Bob', 'Jay']
del name_list
# name 'name_list' is not defined
print(name_list)
del name_list[2]
# ['Tom', 'Bob']
print(name_list)
# pop
pop_name = name_list.pop()
# ['Tom', 'Bob']
print(name_list)
pop_name = name_list.pop(1)
# ['Tom', 'Jay']
print(name_list)
# remove
name_list.remove('Bob')
# ['Tom', 'Jay']
print(name_list)
# clear
name_list.clear()
# []
print(name_list)
修改
修改指定下标数据
列表[i] = x
逆置:reverse()
排序:sort()
列表序列.sort( key=None, reverse=False)
注意:reverse表示排序规则,reverse = True 降序, reverse = False 升序(默认)
复制:copy()
列表的循环遍历
name_list = ['Tom', 'Bob', 'Jay']
# while循环实现
i = 0
while i < len(name_list):
print(name_list[i])
i += 1
print()
# for循环实现
for i in name_list:
print(i)
列表嵌套
列表中嵌套列表
name_list = [['⼩明', '⼩红', '⼩绿'], ['Tom', 'Lily', 'Rose'], ['张三', '李四', '王五']]
print(name_list)
# ['⼩明', '⼩红', '⼩绿']
print(name_list[0])
# ⼩红
print(name_list[0][1])
定义元组
# 多个数据元组
t1 = (1, 2, 3)
print(type(t1)) #
# 单个数据元组
t2 = (1,)
print(type(t2)) #
# 单个数据元组,不加逗号
t3 = (1)
print(type(t3)) #
t4 = ('abc')
print(type(t4)) #
元组常见的操作
元组数据不⽀持修改,只⽀持查找。
tuple1 = ('aa', 'bb', 'cc', 'bb', [10, 22])
# 按下标查找
print(tuple1[3]) # bb
# index
print(tuple1.index('cc')) # 2
# print(tuple1.index('ccc')) # ValueError: tuple.index(x): x not in tuple
# count
print(tuple1.count('bb')) # 2
print(tuple1.count('bbb')) # 0
# len
print(len(tuple1)) # 4
tuple1[4][1] = 'a'
print(tuple1) # ('aa', 'bb', 'cc', 'bb', [10, 'a'])
注意:元组内的直接数据如果修改则⽴即报错,但是如果元组⾥⾯有列表,修改列表⾥⾯的数据则是⽀持的。
字典⾥⾯的数据是以键值对形式出现,字典数据和数据顺序没有关系,即字典不⽀持下标, 后期⽆论数据如何变化,只需要按照对应的键的名字查找数据即可。
创建字典
注意:⼀般称冒号前⾯的为键(key),简称k;冒号后⾯的为值(value),简称v。
字典常见操作
增
注意:如果key存在则修改这个key对应的值;如果key不存在则新增此键值对。
注意:字典为可变类型。
删
改
写法:字典序列[key] = 值
注意:如果key存在则修改这个key对应的值 ;如果key不存在则新增此键值对。
dict1 = {'name': 'Tom', 'age': 20, 'gender': '男'}
# 增
dict1['id'] = '10'
print(dict1)
# 覆盖原有值
dict1['name'] = 'Liming'
print(dict1)
# 删除字典
del(dict1)
print(dict1) # NameError: name 'dict1' is not defined
# 删除键值对
del dict1['gender'] # {'name': 'Tom', 'age': 20}
print(dict1)
del dict1['id'] # KeyError: 'id'
print(dict1)
# 清除字典
dict1.clear()
print(dict1) # {}
# 改
dict1['name'] = 'Lay'
dict1['id'] = 10
print(dict1) # {'name': 'Lay', 'age': 20, 'gender': '男', 'id': 10}
查
key值查找:如果当前查找的key存在,则返回对应的值;否则则报错。
get()
字典序列.get(key, 默认值)
注意:如果当前查找的key不存在则返回第⼆个参数(默认值),如果省略第⼆个参数,则返回None。
keys():查找字典中所有的key,返回可迭代对象
values():查找字典中所有的value,返回可迭代对象
items():查找字典中所有的键值对,返回可迭代对象,里面的数据为元组,元组数据1是字典的key,元组数据2是字典key对应的值。
dict1 = {'name': 'Tom', 'age': 20, 'gender': '男'}
# 键值对
print(dict1['name']) # Tom
# print(dict1['names']) # KeyError: 'names'
# get()
print(dict1.get('name')) # Tom
print(dict1.get('names')) # None
print(dict1.get('names', 'Lili')) # Lili
# keys()
print(dict1.keys()) # dict_keys(['name', 'age', 'gender'])
# values()
print(dict1.values()) # dict_values(['Tom', 20, '男'])
# items()
print(dict1.items()) # dict_items([('name', 'Tom'), ('age', 20), ('gender', '男')])
字典update
字典不存在键值update
字典不存在键值,使用update会添加键值对到字典中
account = "optics"
decrypt_passwd = "12345abc"
accountDict = {}
accountDict.update({account:decrypt_passwd})
print(accountDict) # {‘optics’: ‘12345abc’}
字典已经存在键值update
字典已经存在键值update会更新键的值
account = "optics"
decrypt_passwd = "abcdef"
accountDict = {'optics': '12345abc'}
accountDict.update({account:decrypt_passwd})
print(accountDict) # {‘optics’: ‘abcdef’}
字典的循环遍历
dict1 = {'name': 'Tom', 'age': 20, 'gender': '男'}
# key遍历
for key in dict1.keys():
print(key)
# value遍历
for value in dict1.values():
print(value)
# 键值对遍历
for item in dict1.items():
print(item)
# 遍历字典的键值对(c)
for key, value in dict1.items():
print(f'{key} = {value}')
创建集合
# 创建有数据的集合
s1 = {10, 20, 30, 40}
print(s1) # {40, 10, 20, 30}
s2 = {10, 10, 20, 30, 20}
print(s2) # {10, 20, 30}
s3 = set('12abc')
print(s3) # {'2', '1', 'a', 'b', 'c'}
# 创建空集合
s4 = set()
print(s4) # set()
print(type(s4)) #
s5 = {}
print(type(s5)) #
集合常见操作方法
增加数据
add()
因为集合有去重功能,所以,当向集合内追加的数据是当前集合已有数据的话,则不进⾏任何操作。
update(), 追加的数据是序列。
s1 = {10, 20}
# 增加数据
s1.add(100)
s1.add(10)
print(s1) # {100, 10, 20}
# 增加数据序列
# s1.update(100) # TypeError: 'int' object is not iterable
s1.update([10, 30, 50])
print(s1) # {100, 10, 50, 20, 30}
删除数据
s1 = {10, 20, 30, 40, 50}
# remove
s1.remove(10)
print(s1) # {40, 50, 20, 30}
s1.remove(60)
print(s1) # KeyError: 60
# discard
s1.discard(20)
print(s1) # {40, 50, 30}
s1.discard(70)
print(s1) # {40, 50, 30}
# pop
del_num = s1.pop()
print(del_num) # 40
print(s1) # {50, 30}
查找数据
s1 = {10, 20, 30, 40, 50}
print(10 in s1) # True
print(10 not in s1) # False
运算符 | 描述 | 支持容器类型 |
---|---|---|
+ | 合并 | 字符串、列表、元组 |
* | 复制 | 字符串、列表、元组 |
in | 元素是否存在 | 字符串、列表、元组、字典 |
not in | 元素是否不存在 | 字符串、列表、元组、字典 |
# 1. 字符串
str1 = 'aa'
str2 = 'bb'
# 2. 列表
list1 = [1, 2]
list2 = [10, 20]
# 3. 元组
t1 = (1, 2)
t2 = (10, 20)
print(str1 + str2) # aabb
print(list1 + list2) # [1, 2, 10, 20]
print(t1 + t2) # (1, 2, 10, 20)
# 4. 字典
dict1 = {'name': 'lili'}
dict2 = {'age': '18'}
print(dict1 + dict2) # TypeError: unsupported operand type(s) for +: 'dict' and 'dict'
# 1. 字符串
print('-' * 10) # ----------
# 2. 列表
list1 = ['hello']
print(list1 * 4) # ['hello', 'hello', 'hello', 'hello']
# 3. 元组
t1 = ('world',)
print(t1 * 4) # ('world', 'world', 'world', 'world')
in & not in
# 1. 字符串
str1 = 'aa'
print('a' in str1) # True
print('a' not in str1) # False
print()
# 2. 列表
list1 = [1, 2]
print(1 in list1) # True
print(1 not in list1) # False
print()
# 3. 元组
t1 = (1, 2)
print(2 in t1) # True
print(2 not in t1) # False
print()
# 4. 字典
dict1 = {'name': 'Lili', 'age': '11'}
print('name' in dict1) # True
print('name' not in dict1) # False
print('name' in dict1.values()) # False
print('name' in dict1.keys()) # True
print('name' in dict1.items()) # False
print(('name', 'Lili') in dict1.items()) # True
函数 | 描述 |
---|---|
len() | 计算容器中元素个数 |
del 或 del() | 删除 |
max() | 返回容器中元素最⼤值 |
min() | 返回容器中元素最⼩值 |
range(start, end, step) | ⽣成从start到end的数字,步⻓为 step,供for循环使⽤ |
enumerate() | 函数⽤于将⼀个可遍历的数据对象(如列表、元组或字符串)组合为⼀个索引序 列,同时列出数据和数据下标,⼀般⽤在 for 循环当中。 |
range代码示例
# 1 2 3 4 5 6 7 8 9
for i in range(1, 10, 1):
print(i)
# 1 3 5 7 9
for i in range(1, 10, 2):
print(i)
# 0 1 2 3 4 5 6 7 8 9
for i in range(10):
print(i)
注意:range()⽣成的序列不包含end数字。
enumerate()
enumerate(可遍历对象, start=0)
# 返回结果是元组,元组的第一个数据是原迭代对象的数据对应的下标,元组第二个数据是原迭代对象的数据。
注意:start参数⽤来设置遍历数据的下标的起始值,默认为0。
list1 = ['a', 'b', 'c', 'd', 'e']
'''
(0, 'a')
(1, 'b')
(2, 'c')
(3, 'd')
(4, 'e')
'''
for i in enumerate(list1):
print(i)
'''
(1, 'a')
(2, 'b')
(3, 'c')
(4, 'd')
(5, 'e')
'''
for i in enumerate(list1, start=1):
print(i)
tuple():将某个序列转换成元组
list():将某个序列转换成列表
set():将某个序列转换成集合
代码示例
t1 = ('a', 'b', 'c', 'd', 'e')
list1 = [10, 20, 30, 40, 50, 20]
s1 = {100, 200, 300, 400, 500}
# 转换成元组
print(tuple(list1))
print(tuple(s1))
y
# 转换成列表
print(list(t1))
print(list(s1))
# 转换成集合(列表中重复的数据不会打印)
print(set(list1))
print(set(s1))
作⽤:⽤⼀个表达式创建⼀个有规律的列表或控制⼀个有规律列表
带if的列表推导式
需求:创建0-10的偶数列表
list1 = [i for i in range(0, 10, 2)]
print(list1)
# for循环实现
i = 0
list2 = []
for i in range(10):
if i % 2 == 0:
list2.append(i)
print(list2)
# 带if的推导式
list3 = [i for i in range(10) if i % 2 == 0]
print(list3) # [0, 2, 4, 6, 8]
多个for循环实现列表推导式
需求:创建列表如下:
[(1, 0), (1, 1), (1, 2), (2, 0), (2, 1), (2, 2)]
注:多个for的列表推导式等同于for循环嵌套
list1 = []
for i in range(1, 3):
for j in range(3):
list1.append((i, j))
print(list1)
# 用列表推导式实现
list2 = [(i, j) for i in range(1, 3) for j in range(3)]
print(list2)
字典推导式作⽤:快速合并列表为字典或提取字典中⽬标数据。
# 创建⼀个字典:字典key是1-5数字,value是这个数字的2次⽅。
dict1 = {i: i**2 for i in range(1, 5)}
print(dict1) # {1: 1, 2: 4, 3: 9, 4: 16}
将两个列表合并为一个字典
list1 = ['name', 'age', 'gender']
list2 = ['Tom', 20, 'man']
dict1 = {list1[i]: list2[i] for i in range(len(list1))}
print(dict1) # {'name': 'Tom', 'age': 20, 'gender': 'man'}
# 注意:
# 1. 如果两个列表中的数据个数相同,则使用len统计任何一个列表都可以
# 2. 如果两个列表中的数据个数不同,则使用len统计数据多的列表数据个数会报错,统计数据少的列表数据个数不会报错
提取字典中的目标数据
counts = {'MBP': 268, 'HP': 125, 'DELL': 201, 'Lenovo': 199, 'acer': 99}
print(counts.items()) # 返回键值对
dict3 = {key: value for key, value in counts.items() if value >= 200}
print(dict3) # {'MBP': 268, 'DELL': 201}
# 需求:创建⼀个集合,数据为下⽅列表的2次⽅。
list1 = [1, 1, 2]
set1 = {i**2 for i in list1}
print(set1) # {1, 4} 注:集合去重
函数就是将⼀段具有独⽴功能的代码块 整合到⼀个整体并命名,在需要的位置调⽤这个名称即可完成对 应的需求。
函数在开发过程中,可以更⾼效的实现代码重⽤。
定义函数
def 函数名(参数):
代码1
代码2
......
调用函数
函数名(参数)
注意
# 定义函数时同时定义了接收⽤户数据的参数a和b,a和b是形参
def add_num2(a, b):
result = a + b
print(result)
# 调⽤函数时传⼊了真实的数据10 和 20,真实数据为实参
add_num2(10, 20)
定义函数的说明文档
def 函数名(参数):
""" 说明⽂档的位置 """
代码
......
查看函数的说明文档:help(函数名)
# 加法
def add(a, b):
"""求和函数"""
return a + b
help(add)
# 函数说明文档的高级使用
def add2(a, b):
"""
求和函数
:param a: 参数1
:param b: 参数2
:return: 返回值
"""
return a + b
help(add2)
函数嵌套调⽤指的是⼀个函数⾥⾯⼜调⽤了另外⼀个函数。
变量作⽤域指的是变量⽣效的范围,主要分为两类:局部变量和全局变量。
局部变量
全局变量
# 声明全局变量
a = '全局变量'
def A():
# 声明局部变量
b = '局部变量'
print(b)
print(a)
def B():
# a = '修改后的变量' # 仍然是局部变量
# print(a) # 修改后的变量
global a # 将a定义为全局变量
a = '修改为全局变量'
A()
B()
print(a) # 修改为全局变量
共用全局变量
# 声明全局变量
global_num = 0
def A():
'''修改全局变量'''
global global_num
global_num = 10
print(global_num)
def B():
'''打印全局变量'''
print(global_num)
B() # 0
A() # 10
B() # 10
print(global_num) # 10
返回值作为参数传递
def A():
return 50
def B(num):
print(num)
B(A()) # 50
def test():
# return 1, 2 # 以元组形式返回
# return (10, 20) # 返回元组
# return ['你好', 10] # 返回列表
# return {'name': 'Lili'} # 返回字典
return [10, 20], {10, 15} # ([10, 20], {10, 15})
num = test()
print(num)
注意:
- return a, b 写法,返回多个数据的时候,默认是元组类型。
- return后⾯可以连接列表、元组或字典,以返回多个值。
位置参数
位置参数:调⽤函数时根据函数定义的参数位置来传递参数。
注意:传递和定义参数的顺序及个数必须⼀致。
关键字参数
函数调⽤,通过“键=值”形式加以指定。可以让函数更加清晰、容易使⽤,同时也清除了参数的顺序需求。
注意:函数调⽤时,如果有位置参数时,位置参数必须在关键字参数的前⾯,但关键字参数之间不存在 先后顺序。
缺省参数
缺省参数也叫默认参数,⽤于定义函数,为参数提供默认值,调⽤函数时可不传该默认参数的值(注 意:所有位置参数必须出现在默认参数前,包括函数定义和调⽤)。
注意:函数调⽤时,如果为缺省参数传值则修改默认参数值;否则使⽤这个默认值。
def user_info(name, age, gender = '男'):
print(f'您的姓名是{name},年龄为{age},性别是{gender}')
# 位置参数
user_info('Lili', 20, '女')
user_info(20, 'Lili', '女') # 无意义
# test('Lili', 20) # TypeError: test() missing 1 required positional argument: 'gender' Test()缺少1个必需的位置参数:'gender'
# 关键字参数
user_info(gender='女', age='15', name='Lili') # 关键字参数不分先后顺序
user_info('Lili', gender='女', age='15') # 位置参数必须写在关键字参数前面
# user_info(gender='女', age='15', 'Lili') # positional argument follows keyword argument
# 缺省参数
user_info('liming', 20) # 没有为缺省参数传值,使用默认值
user_info('Lihao', 18, '女') # 为缺省参数传值,使用该值代替默认值
不定长参数
不定⻓参数也叫可变参数。⽤于不确定调⽤的时候会传递多少个参数(不传参也可以)的场景。此时,可⽤包裹(packing)位置参数,或者包裹关键字参数,来进⾏参数传递,会显得⾮常⽅便。
包裹位置传递
# 接收所有位置参数,返回一个元组
def user_info(*args):
print(args)
user_info('Lili') # ('Lili',)
user_info('Lili', 20) # ('Lili', 20)
user_info('Lili', 20, '男') # ('Lili', 20, '男')
user_info() # ()
注意:传进的所有参数都会被args变量收集,它会根据传进参数的位置合并为⼀个元组(tuple), args是元组类型,这就是包裹位置传递。
包裹关键字传递
# 包裹关键字传递
# 收集所有关键字参数,返回一个字典
def user_info1(**kwargs):
print(kwargs)
user_info1() # {}
user_info1(name='Tom') # {'name': 'Tom'}
user_info1(name='Tom', age=20) # {'name': 'Tom', 'age': 20}
综上:⽆论是包裹位置传递还是包裹关键字传递,都是⼀个组包的过程。
拆包
拆包:元组
def num():
return 100, 200
num1, num2 = num()
print(num1)
print(num2)
拆包:字典
dict1 = {'name': 'TOM', 'age': 18}
a, b = dict1
# 对字典进⾏拆包,取出来的是字典的key
print(a) # name
print(b) # age
print(dict1[a]) # TOM
print(dict1[b]) # 18
交换变量值
需求:有变量 a = 10 和 b = 20 ,交换两个变量的值。
# 方法一:借助中间变量
a = 10
b = 20
c = a
a = b
b = c
print(a)
print(b)
# 方法二:简便方法
c = 30
d = 40
c, d = d, c
print(c) # 40
print(d) # 30
了解引用
在python中,值是靠引⽤来传递来的。 可以⽤id() 来判断两个变量是否为同⼀个值的引⽤。可以将id值理解为那块内存的地址标 识。
a = 1
b = a
print(id(a)) # 140717864313680
print(id(b)) # 140717864313680
a = 10
print(id(a)) # 140717864313968
print(id(b)) # 140717864313680 整型为不可变类型
aa = [10, 20, 30]
bb = aa
print(id(aa)) # 3014536290952
print(id(bb)) # 3014536290952
aa.append(40)
print(id(aa)) # 3014536290952
print(id(bb)) # 3014536290952 列表为可变类型
引用当作实参
def test1(a):
print(a)
# b:140717864314288 c:1850972988040
print(id(a))
a += a
# b:140717864314288 c:1850972988040
print(id(a))
# int:计算前后的id值不同
b = 10
test1(b)
# 列表:计算前后的id值相同
c = [10, 20]
test1(c)
所谓可变类型与不可变类型是指:数据能够直接进⾏修改,如果能直接修改那么就是可变,否则是不可变。
# 显示菜单
def print_info():
print('-' * 20)
print('欢迎登录学员管理系统')
print('1: 添加学员')
print('2: 删除学员')
print('3: 修改学员信息')
print('4: 查询学员信息')
print('5: 显示所有学员信息')
print('6: 退出系统')
print('-' * 20)
# 用列表存储所有学员的信息
info = []
# 添加学员信息
def add_info():
"""添加学员函数"""
# 用户输入学生信息
new_id = input('请输入学号:')
new_name = input('请输入姓名:')
new_tel = input('请输入手机号:')
# 判断是否已经添加学生信息
global info
# 学生姓名重复,则报错
for i in info:
if new_name == i['name']:
print('该用户已经存在')
# 退出当前函数,使得增加函数不执行
return
# 不存在,新增数据
info_dict = {}
info_dict['id'] = new_id
info_dict['name'] = new_name
info_dict['tel'] = new_tel
info.append(info_dict)
print(info)
# 删除学员
def del_info():
"""删除学员"""
del_name = input('请输入要删除的学员的姓名:')
# 判断删除的学员是否存在,存在则删除,否则提示不存在
for i in info:
if i['name'] == del_name:
info.remove(i)
break
else:
print('该学员不存在')
print(info)
# 修改学员函数
def modify_info():
"""修改学员信息"""
modify_name = input('请输入要修改的学员的姓名:')
# 判断学员是否存在
for i in info:
if i['name'] == modify_name:
i['tel'] = input('请输入新的手机号:')
break
else:
print('该学员不存在')
print(info)
# 查询学员信息
def search_info():
"""查询学员信息"""
search_name = input('请输入要查询的学员的姓名:')
global info
for i in info:
if search_name == i['name']:
print(f"该学员的姓名为{i['name']},id为{i['id']},手机号为{i['tel']}")
break
else:
# 循环正常结束,查找失败
print('该学员不存在')
# 显示所有学员的信息
def print_all():
"""显示所有学员的信息"""
print("学号\t姓名\t手机号")
# 打印所有学员
for i in info:
print(f"{i['id']}\t{i['name']}\t{i['tel']}")
while True:
# 1. 显示功能界⾯
print_info()
# 2. ⽤户选择功能
user_num = input('请选择您需要的功能序号:')
# 3. 根据⽤户选择,执⾏不同的功能
if user_num == '1':
# print('添加学员')
add_info()
elif user_num == '2':
# print('删除学员')
del_info()
elif user_num == '3':
# print('修改学员信息')
modify_info()
elif user_num == '4':
# print('查询学员信息')
search_info()
elif user_num == '5':
# print('显示所有学员信息')
print_all()
elif user_num == '6':
# print('退出系统')
exit_flag = input('确定要退出?yes or no')
if exit_flag == 'yes':
break
else:
print('输⼊错误,请重新输⼊!!!')
特点:
应⽤:3以内数字累加和
def sum_numbers(num):
# 递归出口
if num == 1:
return 1
return num + sum_numbers(num - 1)
print(sum_numbers(3))
如果⼀个函数有⼀个返回值,并且只有⼀句代码,可以使⽤ lambda简化。
lambda 参数列表 : 表达式
注意:
- lambda表达式的参数可有可⽆,函数的参数在lambda表达式中完全适⽤。
- lambda函数能接收任何数量的参数但只能返回⼀个表达式的值
# 函数实现
def fn1():
return 10
print(fn1()) # 10
# lambda 表达式实现匿名函数
fn2 = lambda : 100
print(fn2) # lambda内存地址 at 0x0000014D2E943B70>
print(fn2()) # 100
print((lambda a, b: a + b)(1, 2)) # 3
注意:直接打印lambda表达式,输出的是此lambda的内存地址
# 无参数
fn1 = lambda : 100
print(fn1())
# 一个参数
fn2 = lambda a: a
print(fn2('Hello Python!'))
# 默认参数
fn3 = lambda a, b, c = 100: a + b + c
print(fn3(10, 20))
print(fn3(10, 20, 30))
# 可变参数
fn4 = lambda *args: args
print(fn4(10, 20, 30)) # (10, 20, 30)
print(fn4(10)) # (10,)
# 可变参数 **kwargs
fn5 = lambda **kwargs: kwargs
print(fn5(name='Lili', age=11)) # {'name': 'Lili', 'age': 11}
fn1 = lambda a, b: a if a > b else b
print(fn1(1000, 500)) # 1000
students = [
{'name': 'TOM', 'age': 20},
{'name': 'ROSE', 'age': 19},
{'name': 'Jack', 'age': 22}
]
# 按name值升序排列
students.sort(key=lambda x: x['name']) # 元组中的每一个字典作为x传入,得到其name, 再a
print(students)
# 按name值降序排列
students.sort(key=lambda x: x['name'], reverse=True)
print(students)
# 按age值升序排列
students.sort(key=lambda x: x['age'])
print(students)
# 将函数作为参数传入,化简代码
def add1(a, b, f):
return f(a) + f(b)
# 绝对值求和
print(add1(-1, -5, abs)) # 6
# 四舍五入求和
print(add1(1.2, 3.6, round)) # 5
map()
map(func, lst),将传⼊的函数变量func作⽤到lst变量的每个元素中,并将结果组成新的列表(Python2)/ 迭代器(Python3)返回。
# 需求:计算 list1 序列中各个数字的2次⽅。
list1 = [1, 2, 3, 4, 5]
def func(x):
return x**2
result = map(func, list1)
print(result) #
print(list(result)) # [1, 4, 9, 16, 25]
reduce()
reduce(func(x,y),lst),其中func必须有两个参数。每次func计算的结果继续和序列的下⼀个元素做累 积计算。
# 需求:计算 list1 序列中各个数字的累加和。
import functools
list1 = [1, 2, 3, 4, 5]
def func(a, b):
return a + b
result = functools.reduce(func, list1)
print(result)
注意:reduce()传⼊的参数func必须接受2个参数。
filter()
filter(func, lst)函数⽤于过滤序列, 过滤掉不符合条件的元素, 返回⼀个 filter 对象,。如果要转换为列表, 可以使⽤ list() 来转换。
# 需求:过滤列表中的偶数
list1 = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
def func(x):
return x % 2 == 0
# 满足func()函数的数据全都过滤掉
result = filter(func, list1)
print(result) #
print(list(result)) # [2, 4, 6, 8, 10]
⽂件操作的作⽤就是把⼀些内容(数据)存储存放起来,可以让程序下⼀次执⾏的时候直接使⽤,⽽不必重新制作⼀份,省时省⼒。
打开
在python,使⽤open函数,可以打开⼀个已经存在的⽂件,或者创建⼀个新⽂件,语法如下:
open(name, mode)
name:是要打开的⽬标⽂件名的字符串(可以包含⽂件所在的具体路径)。
mode:设置打开⽂件的模式(访问模式):只读、写⼊、追加等。
打开文件模式(+号代表可读可写,b代表二进制格式访问)
模式 | 描述 |
---|---|
r | 以只读⽅式打开⽂件。⽂件的指针将会放在⽂件的开头。这是默认模式。 |
rb | 以⼆进制格式打开⼀个⽂件⽤于只读。⽂件指针将会放在⽂件的开头。这是默认模式。 |
r+ | 打开⼀个⽂件⽤于读写。⽂件指针将会放在⽂件的开头。 |
rb+ | 以⼆进制格式打开⼀个⽂件⽤于读写。⽂件指针将会放在⽂件的开头。 |
w | 打开⼀个⽂件只⽤于写⼊。如果该⽂件已存在则打开⽂件,并从开头开始编辑,即原有内 容会被删除。如果该⽂件不存在,创建新⽂件。 |
wb | 以⼆进制格式打开⼀个⽂件只⽤于写⼊。如果该⽂件已存在则打开⽂件,并从开头开始编 辑,即原有内容会被删除。如果该⽂件不存在,创建新⽂件。 |
w+ | 打开⼀个⽂件⽤于读写。如果该⽂件已存在则打开⽂件,并从开头开始编辑,即原有内容 会被删除。如果该⽂件不存在,创建新⽂件。 |
wb+ | 以⼆进制格式打开⼀个⽂件⽤于读写。如果该⽂件已存在则打开⽂件,并从开头开始编 辑,即原有内容会被删除。如果该⽂件不存在,创建新⽂件。 |
a | 打开⼀个⽂件⽤于追加。如果该⽂件已存在,⽂件指针将会放在⽂件的结尾。也就是说, 新的内容将会被写⼊到已有内容之后。如果该⽂件不存在,创建新⽂件进⾏写⼊。 |
ab | 以⼆进制格式打开⼀个⽂件⽤于追加。如果该⽂件已存在,⽂件指针将会放在⽂件的结 尾。也就是说,新的内容将会被写⼊到已有内容之后。如果该⽂件不存在,创建新⽂件进 ⾏写⼊。 |
a+ | 打开⼀个⽂件⽤于读写。如果该⽂件已存在,⽂件指针将会放在⽂件的结尾。⽂件打开时 会是追加模式。如果该⽂件不存在,创建新⽂件⽤于读写。 |
ab+ | 以⼆进制格式打开⼀个⽂件⽤于追加。如果该⽂件已存在,⽂件指针将会放在⽂件的结 尾。如果该⽂件不存在,创建新⽂件⽤于读写。 |
主访问模式
# r: 若文件不存在,则报错,且不支持写入操作,表示只读
f = open('text1.txt', 'r') # No such file or directory: 'text1.txt'
f = open('text.txt', 'r')
f.write('abc')
f.close()
# w: 只写,若文件不存在,则新建文件,执行写入,并且会覆盖原有内容
f = open('t1.txt', 'w')
f.write('aaa') # 原文件内容会被覆盖
f.close()
# a: 追加,若文件不存在,新建文件,并在原有内容上追加新的内容
f = open('t2.txt', 'a')
f.write('bbb') # 追加至原文件内容后面
f.close()
# 访问模式参数可以省略,若省略则表示访问模式为r
f = open('t1.txt')
f = open('t3.txt') # No such file or directory: 't3.txt'
f.close()
次访问模式
# # r+特点: r没有该文件则报错,文件指针在开头,故能读取出来数据
# f = open('text.txt', 'r+')
# # f = open('text1.txt', 'r+') # [Errno 2] No such file or directory: 'text1.txt'
# w+: 没有该文件会新建文件,w特点:文件指针在开头,用新内容覆盖原内容
# f = open('text.txt', 'w+')
# a+:没有该文件会新建文件,文件指针在结尾,无法读取数据(文件指针后无数据)
f = open('text.txt', 'a+')
contend = f.read()
print(contend)
文件对象方法
写
文件对象.write('内容')
# 1. 打开⽂件
f = open('test.txt', 'w')
# 2.⽂件写⼊
f.write('hello world')
# 3. 关闭⽂件
f.close()
注意:
- w 和 a 模式:如果⽂件不存在则创建该⽂件;如果⽂件存在, w 模式先清空再写⼊, a 模式直接末尾追加。
- r 模式:如果⽂件不存在则报错。
读
read()
⽂件对象.read(num)
num表示要从⽂件中读取的数据的⻓度(单位是字节),如果没有传⼊num,那么就表示读取⽂ 件中所有的数据。
f = open('text.txt', 'r')
# 读取文件内容
# 不写参数
print(f.read())
# 写参数,若文件内容换行,则默认包含换行符\n,读取时会算作一个字符。
print(f.read(10))
f.close()
readlines()
readline()
f = open('text.txt', 'r')
content = f.readlines()
print(content) # ['aaaaa\n', 'bbbbb\n', 'ccccc\n', 'ddddd\n', 'eeeee']
content = f.readline()
print(content) # aaaaa
f.close()
seek()函数
作⽤:⽤来移动⽂件指针。
语法:
⽂件对象.seek(偏移量, 起始位置)
起始位置: 0:⽂件开头; 1:当前位置; 2:⽂件结尾
关闭文件
⽂件对象.close()
# 需求:⽤户输⼊当前⽬录下任意⽂件名,程序完成对该⽂件的备份功能(备份⽂件名为xx[备份]后缀,例
# 如:test[备份].txt)。
# 用户输入目标文件
old_name = input('请输入您要备份的文件名:')
# 提取备份文件名字
index = old_name.rfind('.') # 找到文件后缀
# 有效文件才备份
if index > 0:
postfix = old_name[index:]
# 组织新名字
print(old_name[:index]) # 名字
print(old_name[index:]) # 后缀
new_name = old_name[:index] + '[备份]' + postfix
print(new_name)
# 给备份文件写入数据
# 打开源文件和备份文件
old_f = open(old_name, 'rb')
new_f = open(new_name, 'wb')
# 循环写入,以防止读取数据过大
while True:
con = old_f.read(1024)
# 数据读取出来为空,则终止循环
if(len(con) == 0):
break
new_f.write(con)
# 关闭文件
old_f.close()
new_f.close()
在Python中⽂件和⽂件夹的操作要借助os模块⾥⾯的相关功能,具体步骤如下:
import os
使⽤ os 模块相关功能
os.函数名()
文件重命名
os.rename(⽬标⽂件名, 新⽂件名)
删除文件
os.remove(⽬标⽂件名)
创建文件夹
os.mkdir(⽂件夹名字)
删除文件夹
os.rmdir(⽂件夹名字)
获取当前目录
os.getcwd()
改变默认目录
os.chdir(⽬录)
获取目录列表
os.listdir(⽬录)
import os
# 重命名
# os.rename('t1.txt', 't3.txt')
# 删除文件
# os.remove('t3.txt')
# 创建文件夹
# os.mkdir('aaa') # 当前目录下创建
# 删除文件夹
# os.rmdir('aaa')
# 获取当前文件所在路径
print(os.getcwd())
# 切换目录路径
# os.chdir('aaa')
# 在aaa文件加中创建新文件夹
# os.mkdir('bbb')
# 获取某个文件夹下的所有文件,并以列表的形式返回
# print(os.listdir()) # 没有参数则获取根目录下的所有文件信息
# print(os.listdir('aaa'))
# 重命名文件夹
# os.chdir('aaa') # 切换到aaa文件夹下
# os.rename('bbb', 'bb') # 将aaa文件夹下的bbb重命名
# 需求:批量修改⽂件名,既可添加指定字符串,⼜能删除指定字符串。
import os
# 设置重命名标识:如果为1则添加指定字符,flag取值为2则删除指定字符
flag = 1
# 获取指定⽬录
dir_name = './'
# 获取指定⽬录的⽂件列表
file_list = os.listdir(dir_name)
# print(file_list)
# 遍历⽂件列表内的⽂件
for name in file_list:
# 添加指定字符
if flag == 1:
new_name = 'Python-' + name
# 删除指定字符
elif flag == 2:
num = len('Python-')
new_name = name[num:]
# 打印新⽂件名,测试程序正确性
print(new_name)
# 重命名
os.rename(dir_name + name, dir_name + new_name)
⾯向对象就是将编程当成是⼀个事物,对外界来说,事物是直接使⽤的,不⽤去管他内部 的情况。⽽编程就是设置事物能够做什么事。
类和对象的关系:⽤类去创建(实例化)⼀个对象。
类是对⼀系列具有相同特征和⾏为的事物的统称,是⼀个抽象的概念,不是真实存在的事物。
特征即是属性
⾏为即是⽅法添加和获取对象属性
对象是类创建出来的真实存在的事物。
注:先有类才能创建对象。
定义类
Python2中类分为:经典类 和 新式类
语法
class 类名():
代码
......
注意:类名要满⾜标识符命名规则,同时遵循⼤驼峰命名习惯。
拓展:经典类
不由任意内置类型派⽣出的类,称之为经典类
class 类名:
代码
......
创建对象
对象⼜名实例。
语法
对象名 = 类名()
实例
class Washer():
def wash(self):
print('洗衣服')
# 创建对象
haier = Washer()
print(haier) # <__main__.Washer object at 0x00000206FDE43358>
# 实例方法/对象方法 -- 对象名.wash()
haier.wash() # 洗衣服
注意:创建对象的过程也叫实例化对象。
self
self指的是调⽤该函数的对象。
实例
# 1. 定义类
class Washer():
def wash(self):
print('我会洗⾐服')
# <__main__.Washer object at 0x0000024BA2B34240>
print(self)
# 2. 创建对象
haier1 = Washer()
# <__main__.Washer object at 0x0000018B7B224240>
print(haier1)
# haier1对象调⽤实例⽅法
haier1.wash()
haier2 = Washer()
# <__main__.Washer object at 0x0000022005857EF0>
print(haier2)
注意:打印对象和self得到的结果是⼀致的,都是当前对象的内存中存储地址。
属性即是特征,⽐如:洗⾐机的宽度、⾼度、重量…
对象属性既可以在类外⾯添加和获取,也能在类⾥⾯添加和获取。
类外⾯添加对象属性
语法
对象名.属性名 = 值
类外⾯获取对象属性
语法
对象名.属性名
实例
# 类外⾯添加对象属性
haier1.width = 500
haier1.height = 800
# 类外⾯获取对象属性
print(f'haier1洗⾐机的宽度是{haier1.width}')
print(f'haier1洗⾐机的⾼度是{haier1.height}')
类⾥⾯获取对象属性
语法
self.属性名
示例
# 定义类
class Washer():
def print_info(self):
# 类⾥⾯获取实例属性
print(f'haier1洗⾐机的宽度是{self.width}')
print(f'haier1洗⾐机的⾼度是{self.height}')
# 创建对象
haier1 = Washer()
# 添加实例属性
haier1.width = 500
haier1.height = 800
haier1.print_info()
在Python中,__xx__()
的函数叫做魔法⽅法,指的是具有特殊功能的函数。
__init__
体验__init__()
__init__()
⽅法的作⽤:初始化对象。
class Washer():
# 定义初始化功能的函
def __init__(self):
# 添加实例属性
self.width = 500
self.height = 800
def print_info(self):
# 类⾥⾯调⽤实例属性
print(f'洗⾐机的宽度是{self.width}, ⾼度是{self.height}')
haier1 = Washer()
haier1.print_info()
注意:
__init__()
⽅法,在创建⼀个对象时默认被调⽤,不需要⼿动调⽤
__init__(self)
中的self参数,不需要开发者传递,python解释器会⾃动把当前的对象引 ⽤传递过去。
带参数的__init__()
对初始化函数传递参数可以对不同的对象设置不同的初始化属性
class Washer():
def __init__(self, width, height):
self.width = width
self.height = height
def print_info(self):
print(f'洗⾐机的宽度是{self.width}')
print(f'洗⾐机的⾼度是{self.height}')
haier1 = Washer(10, 20)
haier1.print_info()
haier2 = Washer(30, 40)
haier2.print_info()
__str__()
当使⽤print输出对象的时候,默认打印对象的内存地址。如果类定义了 str ⽅法,那么就会打印从 在这个⽅法中 return 的数据。
class Washer():
def __init__(self, wigth, height, name):
self.wigth = wigth
self.height = height
self.name = name
def info(self):
print(f'{self.name}的宽度为{self.wigth}')
print(f'{self.name}的高度为{self.height}')
def __str__(self):
return f'这个洗衣机的名称是{self.name}'
haier1 = Washer(100, 200, 'haier1')
haier1.info() # haier1的宽度为100
haier2 = Washer(400, 500,'haier2')
haier2.info() # haier2的宽度为400
print(haier2) # 这个洗衣机的名称是haier2
__del__()
当删除对象时,python解释器也会默认调⽤__del__()
⽅法。
class Washer():
def __init__(self, wigth, height, name):
self.wigth = wigth
self.height = height
self.name = name
def info(self):
print(f'{self.name}的宽度为{self.wigth}')
print(f'{self.name}的高度为{self.height}')
def __str__(self):
return f'这个洗衣机的名称是{self.name}'
def __del__(self):
print(f'{self.name}已经删除成功!')
del haier2 # haier2已经删除成功!
# haier1已经删除成功!
若不使用del手动删除对象,则当代码执行完毕后会自动调用
__del__()
方法删除对象。`
__call__()
__call__
可以把类实例当做函数调用。
import time
# 类中的__call__魔法方法,只要类对象中实现了__call__方法,
# 创建实例对象test = Test() 后,实力对象后面加括号会自动调用__call__里的方法。
class Test():
def __init__(self):
print('一旦创建实例对象,自动调用__inni__()')
def __del__(self):
print('一旦销毁实例对象或者函数程序停止运行,自动调用__del__()')
def __call__(self):
print('实力对象后面加(),自动调用__call__()')
test = Test()
# del test # 删除对象
test()
time.sleep(5)
# 运行结果
# 一旦创建对象,自动调用__inni__()
# 实例对象后面加(),自动调用__call__
# 。。。。。(5s后)。。。。。。
# 一旦销毁实力对象或者函数程序停止运行,自动调用__del__()
实现了
__call__
方法的类的实例化对象可以像函数一样去调用它。
__getitem__()
__getitem__
可以让对象实现迭代功能,这样就可以使用for...in...
来迭代该对象了。调用对象的属性可以像字典取值一样使用中括号[‘key’]
class Animal:
def __init__(self, animal_list):
self.animals_name = animal_list
def __getitem__(self, index):
return self.animals_name[index]
animals = Animal(["dog","cat","fish"])
for animal in animals:
print(animal)
# 输出结果
'''
dog
cat
fish
'''
当一个类.中定义了getitem方法,那么它的实例对象便拥有了通过下标来索引的能力。即实例对象(假设为P)可以P[key]这样取值。当实例对象做P[key]运算时,就会调用类中的__getitem__()方法。
class A(object): def __getitem__(self, item): return item a = A() print(a[5], a[12]) # 5 12