一、列表
定义:在[]内,可以存放多个任意类型的值,并以逗号隔开。
一般用于存放学生的爱好,课堂的周期等。
优先掌握的操作有:
1、按索引存取值(正向存取+反向存取):即可存也可取
2、切片(顾头不顾尾,步长)
3、长度
4、成员运算in和not in
5、追加
6、删除
7、循环
student_info = ['YangBo',84,'male',['唱歌','做饭']] # 优先掌握的操作: # 1、按索引存取值(正向存取+反向存取):即可存也可取 print(student_info[-2]) # 2、切片(顾头不顾尾,步长) print(student_info[0:4:2]) # 3、长度 print(len(student_info))#4 # 4、成员运算in和not in print('YangBo'in student_info) print('YangBo'not in student_info) # 5、追加 student_info = ['YangBo',84,'male',['唱歌','做饭']] student_info.append('安徽的一所高校,HFUU') print(student_info) # 6、删除 # 删除列表中索引为2的值 del student_info[2] print(student_info) # 7、循环 for student in student_info: print(student) 输出结果为: male ['YangBo', 'male'] 4 True False ['YangBo', 84, 'male', ['唱歌', '做饭'], '安徽的一所高校,HFUU'] ['YangBo', 84, ['唱歌', '做饭'], '安徽的一所高校,HFUU'] YangBo 84 ['唱歌', '做饭'] 安徽的一所高校,HFUU
需要掌握的:
1、index 获取列表中某个值的索引
2、count 获得列表中某个值的数量
3、取值
4、移除,把列表中的某个值的第一个值移除
5、插入值
6、extend 合并列表
# 需要掌握的: student_info = ['尹正',95,'male',['尬舞','喊麦']] # 1、index 获取列表中某个值的索引 print(student_info.index(95))#1 # 2、count 获得列表中某个值的数量 print(student_info.count(95))#1 # 3、取值 # 若pop()括号中写了索引,则取索引对应的值 student_info.pop() print(student_info) # 取出列表中索引为2的值,并赋值给sex变量名 sex = student_info.pop(2) print(sex) print(student_info) # 4、移除,把列表中的某个值的第一个值移除 student_info3 = ['尹正',95,'male',['尬舞','喊麦'],95] student_info3.remove(95) print(student_info3) name = student_info3.remove('尹正') print(name) print(student_info3) # 5、插入值 student_info = ['尹正',95,'male',['尬舞','喊麦'],95] # 在student_info中,索引为3的位置插入“合肥学院” student_info.insert(3,'HFUU') print(student_info) # 6、extend 合并列表 student_info1 = ['尹正',95,'famale',['尬舞1','喊麦2'],95] student_info2 = ['娄一付',94,'famale',['尬舞1','喊麦2']] student_info1.extend(student_info2) print(student_info1) 输出结果为: 1 1 ['尹正', 95, 'male'] male ['尹正', 95] ['尹正', 'male', ['尬舞', '喊麦'], 95] None ['male', ['尬舞', '喊麦'], 95] ['尹正', 95, 'male', 'HFUU', ['尬舞', '喊麦'], 95] ['尹正', 95, 'famale', ['尬舞1', '喊麦2'], 95, '娄一付', 94, 'famale', ['尬舞1', '喊麦2']]
二、元组
定义:在()内,可存放多个任意类型的值,并以逗号隔开。
注意:元组与列表不一样的是,只能在定义时初始化值,不能对其进行修改。
优点:在内存中占用的资源列表要小。
优先掌握的操作:
1、按索引存取值(正向存取+反向存取):只能取
2、切片(顾头不顾尾,步长)
3、长度
4、成员运算in和not in
5、循环
tuple1 = (1,2,3,'五','六') print(tuple1) # 优先掌握的操作: # 1、按索引存取值(正向存取+反向存取):只能取 print(tuple1[2]) # 2、切片(顾头不顾尾,步长) # 从0开始切片到5-1,步长为3 print(tuple1[0:5:3]) # 3、长度 print(len(tuple1)) # 4、成员运算in和not in print(1 in tuple1) print(1 not in tuple1) # 5、循环 for line in tuple1: #print(line) #print函数默认end的参数是\n print(line,end='_') 输出结果为: (1, 2, 3, '五', '六') 3 (1, '五') 5 True False 1_2_3_五_六_
三、可变类型与不可变类型
不可变类型:
变量的值修改后,内存地址一定不一样
1、 数字类型
int
float
2、字符串类型
str
3、元组类型
tuple
可变类型:
1、列表类型
list
2、字典类型
dict
# 不可变类型 # int numeber = 100 print(id(numeber)) numeber = 111 print(id(numeber)) # float sal = 1.0 print(id(sal)) sal = 2.0 print(id(sal)) # 字符类型 str1 = 'hello python!' print(id(str1)) str2 = str1.replace('hello','like') print(id(str2)) # 可变类型 # 列表 list1 = [1, 2, 3] list2 = list1 list1.append(4) # list1与list2指向的是同一份内存地址 print(id(list1)) print(id(list2)) print(list1) print(list2) 输出结果为: 140706487138960 140706487139312 2306277360000 2306277359952 2306307808688 2306307808816 2306278071480 2306278071480 [1, 2, 3, 4] [1, 2, 3, 4]
四、字典类型
作用:
在{}内,以逗号隔开可存放多个值
以key-value存取,取值速度快
定义:
key必须是不可变类型,value可以是任意类型
取值,字典名+[],括号内写值对应的key
优先掌握的操作:
1、按索引存取值,可存可取
2、长度
3、成员运算in和not in
4、删除
5、键keys(),值values(),键值items()
6、循环
dict1 = {'age':18,'name':'tank'} print(dict1)#{'age': 18, 'name': 'tank'} print(type(dict1))#<class 'dict'> # 取值,字典名+[],括号内写值对应的key print(dict1['age']) # 优先掌握的操作: # 1、按索引存取值,可存可取 # 存一个level:9的值到dict1字典中 dict1['level'] = 9 print(dict1) print(dict1['name']) # 2、长度 print(len(dict1)) # 3、成员运算in和not in print('name' in dict1) print('tank' in dict1) print('tank' not in dict1) # 4、删除 del dict1['level'] print(dict1) # 5、键keys(),值values(),键值items() # 得到字典中所有的key print(dict1.keys()) # 得到字典中所有值的values print(dict1.values()) # 得到字典中所有的items print(dict1.items()) # 6、循环 # 循环遍历字典中所有的key for key in dict1: print(key) print(dict1[key]) 输出结果为: {'age': 18, 'name': 'tank'} <class 'dict'> 18 {'age': 18, 'name': 'tank', 'level': 9} tank 3 True False True {'age': 18, 'name': 'tank'} dict_keys(['age', 'name']) dict_values([18, 'tank']) dict_items([('age', 18), ('name', 'tank')]) age 18 name tank
get
[]取值
get取值
# get dict2 = {'age':18,'name':'tank'} print(dict2.get('age')) 输出结果为: 18 # []取值 print(dict2['sex'])、 输出结果为: KeyError: 'sex' # get取值 print(dict2.get('sex')) # 若找不到sex,为其设置一个默认值 print(dict2.get('sex','male')) 把[]取值代码注释掉,输出结果为: None male
五、循环
1、if 判断:
语法:
if 判断条件:
#若条件成立,则执行此处代码
逻辑代码
elif 判断条件:
#若条件成立,则执行此此处代码
逻辑代码
else
# 若以上判断都不成立,则执行此处代码
逻辑代码
#判断两数大小 x = 10 y = 20 z = 30 # 缩进快捷键,tab向右移动4个空格,shift+tab向左移动4个空格 if x>y: print(x) elif z>y: print(z) else: print(y) 输出结果为: 30
2、while循环
语法:
while 条件判断:
# 成立执行此处
逻辑代码
break # 跳出本层循环
continue #结束本次循环,进入下一次循环
# while循环 while True: name = input('请输入猜测的字符:').strip() if name =='tank': print('tank success') break print('请重新输入!')
若输入为tank,则输出结果如下:
若输入不是tank,则输出如下图,直至输入为tank时,输出如上图。
# 限制循环次数 # 初始值 num = 0 # while循环 while num < 3: name = input('请输入猜测的字符:').strip() if name =='tank': print('tank success') break print('请重新输入!') num +=1 若输入如下: 请输入猜测的字符:shahs 请重新输入! 请输入猜测的字符:sadjkad 请重新输入! 请输入猜测的字符:dhud 请重新输入! 执行第三次后,程序结束 若输入如下; 请输入猜测的字符:dsd 请重新输入! 请输入猜测的字符:tank tank success 则第二次就结束
六、文件
文件处理:
open()
写文件
wt:写文本
读文件
rt:读文本
追加写文件
at:追加文本
注意:必须指定字符编码,以什么方式写,就得以什么方式打开。
# 写文本文件 # 参数一:文件的绝对路径 # 参数二:mode 操作文件的模式 # 参数三:encoding 制定的字符编码 f = open('file.text',mode = 'wt',encoding = 'utf-8') f.write('tank') f.close() #关闭操作系统文件资源 # 读文本文件 r == rt f = open('file.text','r',encoding = 'utf-8') print(f.read()) f.close() # 追加文本文件 a = open('file.text','a',encoding = 'utf-8') a.write('\nHFUU') a.close()
则在file.txt文本文档中,显示
tank和HFUU被写入文档中。
执行python文件代码的过程:
1、先启动python解释器,加载到内存中。
2、把写好的python文件加载到解释器中。
3、检测python语法,执行代码。
SyntaxError:语法错误
文件处理之上下文管理:
1、#with 可以管理open打开的文件,
会在with执行完毕后自动调用close()关闭文件
with open() as f "句柄"
2、with可以管理多个文件
# 写
with open('file1.text','w',encoding = 'utf-8') as f: f.write('墨菲定律') # 读 with open('file1.text','r',encoding = 'utf-8') as f: res = f.read() print(res) # 追加 with open('file1.text','a',encoding = 'utf-8') as f: f.write('围城') 读输出结果为: 墨菲定律
file2.txt内容为
对图片、音频、视频进行读写
rb模式,读取二进制,不需要指定字符编码
# 读取相片cxk.jpg with open('cxk.jpg','rb')as f: res = f.read() print(res) jpg = res # 把cxk.jpg的二进制流写入cxk_copy.jpg文件中 with open('cxk_copy.jpg','wb')as f_w: f_w.write(jpg) 图片cxk.jpg的输出为一串二进制流
cxk.jpg图片如下:
cxk_copy.jpg图片如下:
从图片上看没有区别。
with可以管理多个文件,如下:
# 通过with来管理open打开的两个文件句柄f_r,f_w with open('cxk.jpg','rb')as f_r,open('cxk_copy.jpg','wb')as f_w: # 通过f_r句柄把图片的二进制流读出来 res = f_r.read() # 通过f_w句柄把图片的二进制流写入cxk_copy.jpg文件中 f_w.write(res)
七、函数
(一)函数基础
什么是函数?
函数指的其实一把工具
使用函数的好处:
1、解决代码冗余问题。
2、使代码的结构更清晰。
3、易管理。
函数的使用必须遵循:先定义,后调用。
函数定义语法:
def 函数名(参数1,参数2……):
…注释:声明函数…
逻辑代码
return 返回值
def:defind 定义。
函数名:必须看其名之其意。
():接受外部传入的参数。
注释:用来声明函数的作用。
return:返回给调用者的值。
定义函数的三种形式:
1、无参函数
不需要接收外部传入的参数
2、有参函数
需要接收外部传入的参数
3、空函数
pass
# 1、无参函数 def login(): user = input('请输入用户名:').strip() pwd = input('请输入密码:').strip() if user == 'tank' and pwd == '123': print('login successful!') else: print('login error!') # 函数的内存地址 print(login) #内存地址为<function login at 0x00000197472D1640> # 函数调用 login() 当输入tank和123时输出login successful! 否则输出login error!
# 2、有参函数 # username,password 用来接收外部传入的值 def login(username,password): user = input('请输入用户名:').strip() pwd = input('请输入密码:').strip() if user == username and pwd == password: print('login successful!') else: print('login error!') # 函数调用 # 若函数在定义时需要接收参数,调用者必须为其传参 login('tank','123') 若输入分别为tank和123则输出login successful! 否则输出login error!
# 3、空函数 ''' ATM 1、登录 2、注册 3、提现 4、取款 5、转账 6、还款 ''' # 登录功能 def login(): # 代表什么都不做 pass # 注册功能 def register(): pass # 还款功能 def repay(): pass # ...
''' 参数的参数 ''' # 在定义阶段:x,y称之为形参 def func(x, y): #x, y print(x, y) # 在调用阶段:10,100称之为实参 func(10, 100) 输出为10 100
''' 位置参数 位置形参 位置实参 必须按照位置一一传参 ''' # 在定义阶段:位置形参 def func(x, y): #x, y print(x, y) # 在调用阶段:10,100称之为位置实参 func(10, 100) 输出为10 100
''' 关键字参数: 关键字实参 按照关键字传参 ''' # 在定义阶段:位置形参 def func(x, y): print(x, y) # 在调用阶段:x=10,y=100称之为关键字参数 func(y=111, x=10) 输出为10 111 # 不能少传 # func(y=111) #报错 # 不能多传 # func(y=111, x=222, z='333') #报错
''' 默认参数: 在定义阶段,为参数设置默认值 ''' def foo(x=10, y=20): print(x, y) # 不传参,则使用默认参数 #foo() 输出为10 20 # 传参,使用传入的参数 foo(200, 300) 输出为200 300
(二)高级函数
1、函数的嵌套定义
在函数内部定义函数。
2、函数对象
函数的内存地址称之为函数对象
3、函数的名称空间
内置:
python解释器自带的都称之为“内置名称空间”。
全局:
所有顶着头写的变量、函数...都称之为“全局名称空间”。
局部:
在函数内部定义的,都称之为“局部名称空间”。
名称空间加载顺序:
内置 ---> 全局 ---> 局部
名称空间查找顺序:
局部 ---> 全局 ---> 内置
# 函数的嵌套定义 def func1(): print('from func1...') def func2(): print('from func2...')
# 函数对象 def f1(): pass def f2(): pass dic1 = {'1':f1,'2':f2} choice = input('请选择功能编号:') if choice == '1': print(dic1[choice]) dic1[choice]() elif choice == '2': print(dic1[choice]) dic1[choice]() 若输入1,则输出 <function f1 at 0x0000023DFDB41640> 若输入2,则输出 <function f2 at 0x000001B9A11965C0>
# 名称空间 #第一种 # 函数的嵌套定义 x = 10 def func1(): print('from func1...') print(x) def func2(): print('from func2...') func1() 此时输出为: from func1... 10 #第二种 x = 10 def func1(): x = 20 print('from func1...') print(x) def func2(): print('from func2...') func1() 此时输出为: from func1... 20 #第三种 def func1(): # x = 20 print('from func1...') print(x) x = 30 def func2(): print('from func2...') func1() 此时: 报错,代码是由上自下执行,print(x)无法引用x=30,所以报错