周结3
文件
文件的概念
文件就是操作系统提供给我们操作硬盘的方式,我们可以通过文件具体化的访问硬盘空间
打开文件的两种方式
两种打开文件的方式
1.方式1.open close 返回对象用一个变量名来接收
f = open(文件路径,读写模式,文本文件的编码格式)
f.close
eg:
f = open('a.txt','r',encoding='utf8')
2.with 上下文管理
打开一个文件:
with open('a.txt','r',encoding = 'utf8')as f:
子代码
打开多个文件,中间用逗号隔开:
with open('a.txt','r',encoding='utf8')as read_f,open('b.txt','w',encoding= 'utf8')as write_f:
with上下文管理自己会调用f.close来关闭文件资源,避免撬棍和字母发生一些特殊含义,一般我们在第一个参数字符串前面加上r
文件的读写模式
1.r 只读模式
文件路径不存在,直接报错
文件路径存放,正常读取文件
2.w 只写模式
文件路径不存在,自动创建一个文件
文件路径存在,先清空文件内容,等待写入
3.a 只追加模式
文件路径不存在,创建空文件
文件路径存在,直接在文件的尾部追加内容
4.+ 可读可写 一般我们不用
文件的操作模式
1. t 文本模式 默认的方式
1.只能操作文本文件
2.读写都是以字符为单位
3.需要指定edcoding参数
2. b 二进制模式
1.可以操作任何类型的文件
2.读写都是以字节(bytes类型)为单位
3.不需要指定encoding参数
文件诸多方法
1.read() 一次性读取文件内容,当文件内容较多时,会导致内存溢出
2.for循环 一行行的读取文件内容 防止文件过多造成的内存溢出
3.readline() 一次只读取一行的内容
4.readlines() 一次性读取文件内容,会按照行列组成列表的一个个数据值
5.readable() 判断是否具备读的能力
6.write() 写入数据
7.wirteable() 判断是否具备写的能力
8.writelines() 接收一个列表 一次性将列表中所有数据值写入
9.flush() 将内存中文件数据立刻刷到硬盘中 等价于ctrl+s
函数
函数相当于工具(具有一定功能)
函数的语法结构
def 函数名(参数):
""" 函数注释"""
函数体代码
return 返回值
函数的定义和调用
函数的定义
def func(): 函数在定义阶段只检测语法,不执行代码
函数的调用
func() 函数在调用阶段才执行函数体代码
函数的分类
空函数 函数体代码为空
def func():
pass
无参函数 定义函数时括号里没有参数
def func();
pass
有参函数 定义函数时括号里有参数,调用函数的时候括号里传参
def func(a):
pass
func(a)
函数的返回值
返回值就是函数调用后返回给调用者的结果
返回值由变量名+赋值符号+函数的调用组成
函数放回值的多种情况
1.函数体没有return,默认返回None
2.函数体代码有return,后面没有内容还是放回None
3.函数体代码有return,后面写什么就返回什么
4.函数体代码有return,并且后面有多个数据,则会自动组成元组的形式返回
5.函数体代码遇到return会立刻结束
函数的参数
形式参数
函数定义阶段括号里写的参数,简称‘形参’ 类似于变量名a,b,c
def func(a,b,c):
pass
实际参数
函数调用阶段括号里写的参数,简称‘实参’ 类似于数据值1,2
def func(a,b):
pass
func(1,2)
函数参数
位置参数
位置形参:函数定义阶段括号里从左到右依次写的变量名a,b,c
def func(a,b,c):
pass
位置实参:函数调用阶段阔括号里从左到右一次写的数据值1,2,3
def func(a,b,c):
pass
func(1,2,3)
形参不能被多次赋值
实参没有固定的定义,可以传数据值,也可以传绑定的数据值的变量名
关键字参数
函数调用时指名道姓的传,比如a=10,b=45
def func(a,b):
pass
func(a=10,b=45)
位置传参和关键字传参混合使用时,关键字传参一定要放在位置传参的后面
默认参数
函数调用传参时,从左到右一一对应的传
def func(a,b,c):
pass
func(110,120,119)
a=110 b= 120 c= 119
默认参数必须在位置参数之后,默认参数的值仅在定义阶段被赋值一次
可变长参数
可变长形参
在函数定义阶段,在最后一个形参前面加上*号,函数调用时溢出的位置实参,都会被*号后面的变量名接收,以元组的形式保存下来赋值给形参
def func(*args):
pass
func(a,b,c) # (a,b,c)
在后面一个形参前面加**号,函数调用时溢出的关键字参数,都会双**号后面的变量名接收,以字典的形式保存下来赋值给形参
def func(**kwargs);
pass
func(a=1,b=2,c=3) # {'a':1,'b':2,'c':3}
可变长实参
将定义好的数据值取出来传给函数的三个形参
l1 =[110,120,119]
def func(a,b,c)
print(a,b,c)
func(l1[0],l1[1],l1[2])
注意:字典只能取到键,打印的结果可能是无序的
命名关键字参数
形参必须按照关键字参数传值
def func(name,*args,gender='male',**kwargs)
print(name,args,gender,kwargs)
func('kiki',1,2,a=1,b=2)
名称空间
名称空间就是存储变量名与数据值绑定关系的地方
名称空间分类
内置名称空间:python解释器运行自动产生 len print
全局名称空间:py文件运行产生,里面存放文件级别的名字
局部名称空间:函数体代码执行产生
名称空间存活周期及作用域
存货周期
内置名称空间;python解释器启动则创建,关闭则销毁
全局名称空间:py文件执行则创建,运行结束则销毁
局部名称空间:函数体代码运行则创建,函数体代码结束则销毁
名字的查找顺序
1.当名字处于局部名称空间时,查找的顺序
局部名称空间>>>全局名称空间>>>内置名称空间
2.当名字处于全局名称空间时,查找的顺序
全局名称空间>>>内置名称空间
关键字
global
局部名称空间直接修改全局名称空间的数据
nonlocal
内层局部名称空间修改外层局部名称空间的数据
函数名的多种用法
1.可以当变量名赋值
def func():
pass
res =func
res()
print(res)
2.可以当函数的参数
def func():
print(今天时10月16号)
def index(a):
print(a)
a()
index(func)
3.可以当函数的返回值
第一种:
def func():
pass
def index():
pass
return func
res = index()
res()
第二种:
def func():
pass
def index():
pass
return index
res = func()
res()
4.可以当作容器类型(里面存放多个数据值)
def register():
pass
def login():
pass
def shopping():
pass
dict1 = {'1':register,
'2':login,
'3':shopping}
while True:
number = input('请输入你想要执行的编号>>>:').strip()
if number in dict1:
dict1.get(number)()
else:
print('请输入有效的编号')
闭包函数
定义在内部的函数用到了外部函数名称空间中的名字
def func(name,age):
def inner():
print(f'{name}{age}'')
return inner
res = func('kiki',15)
res()
装饰器
装饰器简介
装饰器:在不修改被装饰对象的源代码和调用方式的前提下为装饰对象添加额外的功能
本质:不是一门新的技术,而是由函数参数、名称空间、函数名多种用法、闭包函数组合到一起的结果
口诀:对修改封闭、对外扩展
无参装饰器模板
def outer(func):
def inner(*args,**kwargs):
print('在被装饰对象之前可以添加的额外操作')
res = func(*args,**kwargs)
print(在执行被装饰对象之后可以添加的额外操作')
return res
return inner
def func():
pass
装饰器语法糖
def outer(func):
def inner(*args,**kwargs):
print('在被装饰对象之前可以添加的额外操作')
res = func(*args,**kwargs)
print(在执行被装饰对象之后可以添加的额外操作')
return res
return inner
@outer
def index():
pass
装饰器语法糖
语法糖会自动将下面紧挨着的函数当作第一个参数自动传给函数用
def outer(func):
def inner(*args,**kwargs):
print('在执行被装饰对象之前可以添加的额外操作')
res = func(*args,**kwargs)
print(在执行被装饰对象之后可以添加的额外操作')
return res
return inner
@outer
def index():
pass
@outer
def index1():
pass
@outer
def index2():
pass
index1()
index2()
index3()
多层语法糖
多层语法糖,加载顺序是从下往上,每次执行完之后,如果上面还有语法糖,则直接将放回值传给上面的语法糖,如果上面没有语法糖了,则用原函数的变量名index来接收outer(wrapper2)
有参装饰器模板
def outer_plus(mode):
def outer(func):
def inner(*args,**kwargs):
print('在被装饰对象之前可以添加的额外操作')
res = func(*args,**kwargs)
print(在执行被装饰对象之后可以添加的额外操作')
return res
return inner
return inner
@outer_plus('1')
def index():
pass
递归函数
函数直接或间接的调用自己,每次调用都要比上一次简单,并且要有一个明确的结束条件
1.直接调用
def index():
print('哈哈哈')
index()
index()
2.间接调用
def index():
print('呵呵')
func()
def func():
print('哈哈哈')
index()
index()
eg:
def demo(n):
if n == 1:
return 16
return demo1(n-1)
res = demo(8)
print(res)
算法
算法就是解救问题的有效方法
二分法
二分法的要求:待查找的数据集必须有序,二分切割
二分法的缺陷:针对开头结尾的数据,查找效率很低
三元表达式
三元表达式:数据值1 if 条件 else 数据值2
判断:如果条件成立,使用数据值1,条件不成立使用数据值2,三元表达式只使用于二选一的结果,对于多选的条件我们不建议使用三元嵌套
各种推导式
1.列表生成式
name_list = ['kiki','kimi','jason','oscar']
new_list = [name+'_good' for name in name_list]
new_list1 = [name1 +'_well' for name1 in name_list if name1=='kiki']
复杂的情况就先判断for>>>if>>>name1_well
2.字典生成式
dict = {i:j for i,j in enumerate('happy')}
print(dict)
3.集合生成式
result = {i for i in 'hello'}
print(result)
4.元组生成式>>>>:元组是没有生成式的,下面是生成器
result = (i for i in 'world')
print(result)
匿名函数
概念:没有名字的函数,需要使用关键字lambda
语法结构: lambda 形参:返回值
匿名函数一般不单独使用,需要配合其他函数一起使用
常见内置函数
1.abs() 绝对值
2.all() 所有数据值对应的布尔值为True结果为是True,否则返回False
3.any() 所有数据之对应的布尔值,有一个为True结果为True,否则返回False
4.bin()cot()hex()int() 转二进制、八进制、十六进制、十进制
5.bytes() 编码
s1 = '今天又是周日了'
Print(bytes(s1,'utf8'))
6.callable() 判断一个名字是否可以加括号调用
7.chr() ord() 基于ASCII做数字字母的转换
8.dir() 返回括号内对象能够调用的名字
9.divmod() 返回是以元组的形式,第一个是数据为商,第二个是余数
result = divmod(99,2)
print(result) #(49,1) 99除于2得整数49,余数为1
10.enumerate() 枚举
11.hash 哈希加密
12.id() input() isinstance() 判断数据类型
13.max() min() map() 映射
map函数也是python中的一个内置函数,map在这里的意思是映射的意思,会根据提供的函数对指定序列做映射。map函数会返回一个迭代器,如果要转换为列表,可以使用 list() 来转换
map(function,iterable), function>>>: 函数 ,iterable>>>: 可遍历对象
l1 = [11,22,33,44,55]
result = map(lambda x :x+1,l1)
print(list(result)) # [12, 23, 34, 45, 56]
""" 一般用列表来接收"""
14.open()
15.pow() 幂指数
16.range()
17.round()
18.sum()
19.reduce()
reduce
""" reduce 传多个值 返回一个值 """
from functools import reduce
l1 = [11, 22, 33, 44, 55, 66]
result = reduce(lambda a,b:a*b,l1)
print(result) # 1275523920
重要内置函数
1.zip
可接受一系列科可迭代的对象作为参数,将对象中的对应的元素打包成一个个元组,zip()返回的是迭代器iterable,当传入的参数相等时,则返回的list的长度和参数相同,但传入的参数不相等时,返回的list长度和参数长度最短的对象相同
2.filter
filter(function or None, iterable) --> filter object
function:函数 作用是对iterable中的每个元素判断是否符合特定条件
None:不调用任何函数,只对可迭代对象中的元素本身判断真假,保留为真的元素
iterable:可迭代对象
l1 =[11,22,33,44,55,66,77,88]
result = filter(lambda x:x>40,l1)
print(list(result)) # 结果得出都是大于40的数据列表[44, 55, 66, 77, 88]
3.sorted
排序,默认升序
迭代器
迭代器就是迭代取值的工具,而迭代是重复反馈过程的活动。通过索引的方式进行迭代取值,实现简单,仅适用于字符串、列表、元组,但没有索引的字典、集合等非序列类型,必须找到一种不依赖索引来进行迭代取值的方式,这就用到了迭代器。
可迭代对象
对象内置有__iter__方法的都称为可迭代对象
1.内置方法 通过点的方式能够调用的方法
2.__iter__ 双下iter方法
范围:
string list dict tuple set 文件对象
不可迭代对象
int float bool 函数对象
迭代器对象
1.是由可迭代对象调用__iter__方法产生
2.迭代器对象判断的本质:看内置是否有__iter__和__next__
注意:可迭代对象调用__iter__会成为迭代器对象,迭代器对象如果还调用__iter__不会有任何变化 还是迭代器对象本身
for循环内部原理
for 变量名 in 可迭代对象:
循环体代码
"""
1.先将in 后面的数据调用__iter__转变成迭代器对象
2.依次让迭代器对象调用__next__取值
3.一旦__next__取不到值报错 for循环会自动捕获并处理
代码实战篇
1.编写⽤户识别程序
要求: 可循环根据⽤户输⼊的姓名不同输出不同的身份信息
添加程序结束功能(如⽤户输⼊字⺟q直接结束识别程序) jason:扫地僧 tony:洗碗⼯ kevin:服务员 jack:配菜员 其他: 未识别
# 循环
while True:
# 1.获取用户的输入
username = input('请输入用户的名字(q)>>>:').strip()
# 3.添加结束功能
if username == 'q':
break
# 2.根据用户不同进行判断
if username == 'jason':
print('扫地增')
elif username== 'tony':
print('洗碗工')
elif username == 'kevin':
print('服务员')
elif username == 'jack':
print('配裁员')
else:
print('未识别')
2.利⽤for循环及range⽅法⾃动⽣成链家⼆⼿房多⻚数据⽹址(⼗条以 上即可) 初始⽹址:https://sh.lianjia.com/ershoufang/
# 1.用一个变量去接收
res1 = 'https://sh.lianjia.com/ershoufang/pg%s/'
# 2.利用for循环遍历
for i in range(1,100,5):
print(res1 % i)
3.编写⽤户登录程序 温馨提示: ⽤户名与密码来源于字符串source_data = 'jason|123' 想办法从中拆分出⽤户名和密码⽤于后续账户信息⽐对 普通要求: 1.验证失败情况下可⼀直循环验证 成功则直接退出 拔⾼练习: 1.只允许三次失败机会 2.登录成功后进⼊内层循环,⽤户输⼊任何指令利⽤格式化输出 打印正在执⾏该⽤户指令即可,直到⽤户输⼊字⺟q退出内层循环
source_date = 'jason|123'
# 4.定义计时器
count_num = 1
# 循环
while count_num<4:
# 1.获取用户名和密码
username = input('请输入用户名的名字>>>:').strip()
password = input('请输入用户名的密码>>>:').strip()
# 2.拆分字符串
real_name, real_pwd = source_date.split('|')
# 3.判断用户名和密码是否相等
if username == real_name and password == real_pwd:
print('登录成功')
# 5.登录成功后进去内部循环
while True:
# 6.获取用户输入任何指令
choice_command = input('请输入您想输入的指令(q)>>>:').strip()
# 8.用户输入q,终止程序
if choice_command == 'q':
break
# 7.格式化输出
print(f'正在执行该用户的指令>>>:{choice_command}' )
# print('正在执行该用户的指令>>>:%s' % choice_command)
else:
print('用户名或者密码错误!!!')
count_num += 1
标签:函数,迭代,周结,func,pass,print,def
From: https://www.cnblogs.com/zhanglanhua/p/16796904.html