本文内容:

文件操作

函数

高阶函数

locals() 和 globals()

迭代器

高阶函数

一 .文件操作

对文件操作流程

打开文件,得到文件句柄并赋值给一个变量

通过句柄对文件进行操作

关闭文件

文件内容可以写入:1.字节流  2.字符串

1.基本操作

#1.打开文件

fp = open("lianxi.txt",mode="w",encoding="utf-8")#2.写入文件

fp.write("把大象塞进去")#3.关闭文件

fp.close()

#1.打开文件

fp = open("lianxi.txt",mode="r",encoding="utf-8")#2.读取文件

res =fp.read()#3.关闭文件

fp.close()print(res)

2.字节流操作

二进制字节流的应用场景: 在数据传输或者在数据存储时,使用的一种数据格式;

多个字符放在一起叫做字符串,多个字节放在一起叫做字节流;

将字符串和字节流(Bytes流)类型进行转换 (参数写成转化的字符编码格式)

encode() 编码 :将字符串转化为字节流(Bytes流)

decode() 解码 :将Bytes流转化为字符串

字节流的格式:字节流语法格式(前面加b) : b"123"

strvar = b"123"strvar= b"abc"

#中文不能在字符串前面加b,必须是ascii编码才能加;#strvar = b"你好" error

print(strvar , type(strvar)) #b'123'

中文和字节流的转化

#encode 编码

strvar = "我爱你".encode("utf-8")print(strvar)#decode 解码

res = strvar.decode("utf-8")print(res)#三个字节表达一个中文字符

s_bytes = b'\xe7\x88\xb1'res= s_bytes.decode("utf-8")print(res)

文件中写入字节流

"""mode = wb 代表写入的是字节流 , 不要指定任何编码集"""

#1.打开文件

fp = open("lianxi2",mode="wb")

strvar= "爱上一匹野马,家里没有草原"

#2.写入字节流

fp.write(strvar.encode())#3.关闭文件

fp.close()

从文件中读字节流

"""mode = rb 代表读取的是字节流 , 不要指定任何编码集"""

#1.打开文件

fp = open("lianxi2",mode="rb")#2.读取字节流

res =fp.read()#3.关闭文件

fp.close()print(res)print(res.decode())

小例子:模拟复制图片的过程

1 #打开原文件,读取其中的字节流

2 fp = open("集合.png",mode="rb")3 res =fp.read()4 fp.close()5 print(res)6

7 #把这些字节流写入到另外文件中

8 fp = open("集合2.gif",mode="wb")9 fp.write(res)10 fp.close()

View Code

总结: 二进制字节流比如:图片,音频,视频 ... 数据使用二进制字节流进行拷贝

3.文件的扩展模式

read()  功能: 读取字符的个数(里面的参数代表字符个数)

seek()  功能: 调整指针的位置(里面的参数代表字节个数)

seek(0)   把光标移动到文件开头

seek(0,2) 把光标移动到文件末尾

tell() 功能: 当前光标左侧所有的字节数(返回字节数)

1..r+ 先读后写

fp = open("lianxi.txt",mode="r+",encoding="utf-8")#先读

res =fp.read()#后写

fp.write("456")#在读

fp.seek(0) #因为文件指针在文件末尾,指向开头

res =fp.read()print(res)

fp.close()

2.r+ 先写后读

r+模式打开后 文件指针默认指向文件的开头,马上写入内容,会覆盖原有的内容

fp = open("lianxi.txt",mode="r+",encoding="utf-8")#先写

fp.seek(0,2) #打开文件后默认指向文件开头

fp.write("789")#后读

fp.seek(0)

res=fp.read()print(res)

fp.close()

3.w+ 可写可读

w+模式打开文件后,首先默认清空文件,所以先读后写没有意义;

fp = open("lianxi2.txt",mode="w+",encoding="utf-8")#先写

fp.write("123")#后读

fp.seek(0)print(fp.read())

fp.close()

4.a+ 可写可读

a+模式打开后 文件指针默认指向文件的末尾,所以可以直接写入内容

fp = open("lianxi3.txt",mode="a+",encoding="utf-8")

fp.write('abc')

fp.seek(0)print(fp.read())

fp.close()

5.比对a+和r+两个模式之间的区别

r+模式下 写入内容时,会随着光标位置的改变而替换原有的字符

a+模式下 写入内容时,会强制把光标移动到文件的末尾

6.seek ,read  , tell 三个方式的使用

read(单位) 单位根据文件打开的模式而产生变化,如果带有b模式,读取的是字节的个数,否则读取的是字符的个数

在移动seek时,小心光标移动到中文字符里,在读取内容时,产生无效的开始字节

fp = open("lianxi.txt",mode="r+",encoding="utf-8")

fp.seek(6)

res= fp.tell() #6

print(res)res= fp.read(3)print(res)

res=fp.tell()print(res)

fp.close()

7. with语法 (上下文管理器)可以省略掉close操作

with open("ceshimv.mp4",mode="rb") as fp1 , open("ceshimv2.mp4",mode="wb") as fp2:

res=fp1.read()

fp2.write(res)

3.文件相关的方法

1.刷新缓冲区 flush

刷新缓冲区有一下几种情况

(1). 当文件关闭的时候自动刷新缓冲区

(2).当整个程序运行结束的时候自动刷新缓冲区

(3)当缓冲区写满了 会自动刷新缓冲区

(4)手动刷新缓冲区

2.文件相关函数

1.readable()     功能: 判断文件对象是否可读

2.writable()     功能: 判断文件对象是否可写

3.readline()    功能 :读取文件一行内容

(1) .先读取一行,如果内容不是空,打印这行数据,在读取下一行进行判断

with open("lianxi.txt",mode="r",encoding="utf-8") as fp:

res=fp.readline()whileres:print(res)

res= fp.readline()

(2).readline(2) 2个字符个数

如果读取个数 > 当前行总个数 : 按照当前行读取

如果读取个数 < 当前行总个数 : 按照个数读取

4.readlines 功能:将文件中的内容按照换行读取到列表当中

5.writelines()   功能:将内容是字符串的可迭代性数据写入文件中 参数:内容为字符串类型的可迭代数据

6.truncate()     功能: 把要截取的字符串提取出来,然后清空内容将提取的字符串重新写入文件中 (字节)

with open("lianxi4.txt",mode="r+",encoding="utf-8") as fp:

fp.truncate(9)

二.函数

1.函数基本格式

定义函数def函数名():

code1

code2...

调用函数

函数名()

2.函数的命名

字母数字下划线,首字符不能为数字;

严格区分大小写,且不能使用关键字;

函数命名有意义,且不能使用中文哦;

1.驼峰命名法:

(1)大驼峰命名法:mycar => MyCar  每个单词首字符大写 (面向对象中 => 类)

(2)小驼峰命名法: mycar => myCar  除了第一个单词首字符小写外,剩下的每个单词首字符大写 (用在函数中 .. )

2.命名法: 单词和单词之间用_分开  mycar => my_car

3.函数的参数

函数的参数的种类: 1.形参   2.实参

1.形参: 形式上的参数,在函数的定义处

2.实参: 实际上的参数,在函数的调用处

形参种类: 1.普通形参(位置形参) 2.默认形参 3.普通收集形参 4.命名关键字形参 5 关键字收集形参

实参种类: 1.普通实参 2.关键字实参

1.普通形参

"""hang,lie是普通形参(位置形参)"""

deffunc(hang,lie):

i=0while i

j=0while j

j+= 1

print()

i+= 1

#调用函数

"""10,10是普通实参"""func(10,10)

func(3,8)

2.默认形参

hang=10,lie=10 是默认形参,如果给与了实参,那么使用实参值,如果没有给与实参,那么使用默认值

def func(hang=10,lie=10):

i=0while i

j=0while j

j+= 1

print()

i+= 1

#调用函数#func()

func(5)#func(4,6)

3.普通形参 + 默认形参

hang普通形参,lie=10默认形参

注意点:默认形参必须跟在普通形参的后面

def func(hang,lie=10):

i=0while i

j=0while j

j+= 1

print()

i+= 1

#func(5)

func(5,6)

4.关键字实参

关键字实参的顺序可以任意颠倒

注意点: 关键字实参必须写在普通实参的后面

def func(hang,a,b,c,lie=10):

i=0while i

j=0while j

j+= 1

print()

i+= 1func(3,4,b=5,lie=7,c=6)

区别关键字实参和默认形参:

1.在def定义处,使用的参数是默认形参

2.在函数的调用处,使用的参数是关键字实参

5.普通收集参数

功能: 专门用来收集那些多余的没人要的普通实参

语法: 在参数的前面加上一颗星

返回: 一个元组

def func(a,b,c,*args):print(a,b,c) #1 2 3

print(args) #(43,44)

func(1,2,3,43,44)

计算任意个数值的累加和

1 def func(*args):2 print(args) #(1, 2, 3, 4, 5, 6, 7)

3 total =04 for i inargs:5 total +=i6 print(total)7

8 func(1,2,3,4,5)

View Code

6.关键字收集参数

功能: 专门用来收集那些多余的没人要的关键字实参

语法: 在参数的前面上加上二颗星星

返回: 一个字典

def func(a,b,c,**kwargs):print(a,b,c) #1 4 3

print(kwargs) #{'f': 5, 'z': 10, 'x': 30}

func(a=1,c=3,f=5,b=4,z=10,x=30)

做任意个数值的字符串拼接

1 """

2 颜值担当: 李雅琪3 靓丽女生: 王永捐4 普通颜值: 于盛林, 荷叶 , 吴洪昌5 """

6

7 def func(**kwargs):8 strvar1 = ''

9 strvar2 = ''

10 dic = {"beautiful_boy":"颜值担当" , "beautiful_girl":"靓丽女生"}11 print(kwargs) #{'beautiful_boy': '李雅琪', 'beautiful_girl': '王永捐', 'common1': '于盛林', 'common2': '荷叶', 'common3': '吴洪昌', 'first': '菲菲', 'last': '石磊'}

12 for k,v inkwargs.items():13 #print(k,v)

14 #如果该键在dic当中,说明是预定义角色,要获取该角色是什么 : 颜值担当 靓丽女生

15 if k indic:16 #颜值担当 : 李雅琪 + '\n'

17 #靓丽女生 : 王永捐 + '\n'

18 strvar1 += dic[k] + ":" + v + '\n'

19 else:20 #于盛林, 荷叶, 吴洪昌, 菲菲, 石磊,

21 strvar2 += v + ","

22

23

24 print(strvar1.strip())25 print( "普通颜值:" , strvar2.strip(",") )26

27 func(beautiful_boy = "李雅琪",beautiful_girl="王永捐",common1="于盛林",common2="荷叶",common3="吴洪昌",first="菲菲",last="石磊")

View Code

7 命名关键字形参

如果是命名关键字形参 , 在调用函数时,必须使用关键字实参的方式调用

(1) def func(a,b,*,c,d) 在星号后面定义的是命名关键字形参

def func(a,b,*,c,d):print(a,b)print(c)print(d)

func(1,2,c=3,d=4)

(2) def func(*args,c,**kwargs) 在普通收集和关键字收集形参之间的是命名关键字形参

print("<=========>")def func(*args,c,**kwargs):print(args)print(c)print(kwargs)

func(1,2,3,4,45,a=1,b=2,c=3)

8.* 和 ** 的使用方法

(1) 在定义处: 负责收集打包数据

* : 负责收集打包成元组

**: 负责收集打包成字典

(2) 在调用处: 负责打散解包数据

* : 负责对list tuple str set 打散解包成单独的数据

**: 负责对dic 打散解包成单独的键=值的形式

#函数的定义处

def func(a,b,*,c,d):print(a,b)print(c,d)

lst= [1,2] #打散之后,把列表里面的元素一个个拿出来作为函数的参数进行调用

tup = (1,2)

set1= {"aaa","bbb"}

str1= "ab"dic= {"aaaa":1,"bbbb":2} #获取的是字典的键#函数的调用处 一颗星 *可迭代数据前面

func(*dic,c=3,d=4) #func(1,2,c=3,d=4)#函数的调用处 二颗星 **只能在字典前面修饰;

dic = {"c":3,"d":4}

func(1,2,**dic) #把字典打散,抽离其中的键值对,变成 => c=3,d=4 关键字实参,作为参数调用函数;

函数的参数定义顺序:

普通形参(位置形参) => 默认形参 => 普通收集形参 -> 命名关键字形参 -> 关键字收集形参;

4.return

return : 会把函数内部的值返回到函数的调用处;

(1)return后面可以接 6大标准数据类型 ,还可以接函数,类,对象,如果没有自定义返回值,默认返回的None

(2)执行完return之后,函数直接终止,后面的代码不执行;

5.全局变量 和 局部变量

局部变量: 在函数内部定义的变量是局部变量

全局变量: 在函数外部或者在函数内部使用global定义的变量是全局变量

作用域: 作用的范围

局部变量: 在函数的内部

全局变量: 横跨整个文件

生命周期:变量存活的时间

内置变量 > 全局变量 > 局部变量

1.局部变量

deffunc():#创建一个局部变量

a = 1

#获取局部变量

print(a)#修改一个局部变量

a = 10

print(a)

func()#print(a) error

2.全局变量

方法一 :在函数外部定义的是全局变量

#创建一个全局变量

b = 100

#获取全局变量

print(b)#修改全局变量

b = 299

print(b)deffunc():#全局变量可以直接在函数内部调用

print(b)

func()

方法二: 在函数内部定义全局变量,依赖global

deffunc():#声明一个全局变量c

globalc#创建一个全局变量

c = 99func()print(c)

#在函数内部修改全局变量

d = 200

deffunc():globald

d= 300func()print(d) #300

global总结:

如果函数外部没有该全局变量,那么可以通过global在函数内部直接创建一个全局变量

如果函数外部有该全局变量,那么可以通过global在函数内部修改当前全局变量

6.函数名的使用

python中的函数可以像变量一样,动态创建,销毁,当参数传递,作为值返回,作为容器中的元素.叫第一类对象.其他语言功能有限

1 #1.动态创建

2 deffunc():3 print("我是func1 ...")4 print(type(func))5 a = 1

6 print(type(a))7 a =func8 a()9

10 #2.动态销毁

11 dela12 #a() error

13 #func()

14

15 #3.当参数传递

16 deffunc1(f):17 f()18

19 deffunc2():20 print("我是func2 ...")21

22 func1(func2)23

24 #4.作为值返回

25 deffunc1(f):26 returnf27

28 deffunc3():29 print("我是func3 ...")30 res =func1(func3)31 res()32

33 #5.可以把函数作为容器中的元素

34 deffunc1():35 print("我是func1 ..")36 deffunc2():37 print("我是func2 ..")38 deffunc3():39 print("我是func3 ..")40 lst =[func1,func2,func3]41 for i inlst:42 i()43

44

45 #### __doc__ 用来查看帮助文档

46 defwash(something):47

48 """

49 功能: 洗衣服的过程50 参数: something => 衣服51 返回值: 洗完的状态52 """

53

54 print( "先脱{}".format(something) )55 print("放在桶里")56 print("到点洗衣液")57 print("泡水,搓一搓")58 print("穿上~")59 return "洗完了"

60

61 wash("衣服")62

63 #__doc__ 函数.__doc__ 获取函数内部自定义文档;

64 res = wash.__doc__

65 print(res)

View Code

7.函数的嵌套

互相嵌套的两个函数:

外层函数即外函数

内层函数即内函数

defouter():

inner()definner():print("我是内函数 ...")

(1)内部函数不可以直接在函数外部调用

(2)调用外部函数后,内部函数不可以在函数外部调用

(3)内部函数可以在函数内部调用吗

(4)内部函数在函数内部调用时,必须先定义函数,在调用函数,没有预加载机制

三层函数嵌套,最外层是outer,中间层是inner ,最里层 smaller , 调用smaller函数

defouter():definner():defsmaller():print("我是smaller函数 ... {}".format(id))

smaller()

inner()

outer()print(outer)

LEGB 就近找变量原则:

找寻变量的调用顺序采用LEGB原则(即就近原则)

B —— Builtin(Python);Python内置模块的命名空间 (内建作用域)

G —— Global(module); 函数外部所在的命名空间 (全局作用域)

E —— Enclosing function locals;外部嵌套函数的作用域(嵌套作用域)

L —— Local(function);当前函数内的作用域 (局部作用域)

依据就近原则,从下往上 从里向外 依次寻找

8.nonlocal (修改局部变量)

nonlocal 专门用来修改局部变量,符合LEGB原则,就近找变量,

(1).找当前作用域上一层空间的变量值进行修改

defouter():

a= 1

definner():

nonlocal a

a= 10

print(a) #10

inner()print(a) #10

outer()

(2).如果上一层不存在,继续向上一层空间进行寻找

defouter():

a= 199

definner():

a= 201

defsmaller():

nonlocal a

a= 200

print(a) #200

smaller()print(a) #200

inner()print(a) #199

outer()

(3).直到最后找不到,直接报错

a = 199 #是全局变量, 而nonlocal用来修改局部变量;

defouter():definner():defsmaller():

nonlocal a

a= 200

print(a)

smaller()print(a)

inner()print(a)

outer()

不通过 nonlocal 可以修改局部变量

defouter():

lst= [10,20,30]definner():

lst[0]= 100inner()print(lst) #[100, 20, 30]

outer()

9、闭包函数

互相嵌套的两个函数,内函数使用了外函数的局部变量,

外函数把内函数返回出来的过程,叫闭包,内函数叫做闭包函数

原则:

(1) 内函数使用了外函数的局部变量

(2) 外函数将内函数返回return

1.闭包函数基本语法

defliyaqi_family():

father= "李嘉诚"

defhobby():print("我对钱没有兴趣,我只对捐钱感兴趣,这是我爸爸{}说的".format(father))returnhobby

res=liyaqi_family()

res()

2.闭包的复杂语法

1 defliangruiqing_family():2 jiejie = "马蓉"

3 meimei = "马诺"

4 money = 1000

5

6 defjiejie_hobby():7 nonlocal money8 money -= 600

9 print("喜欢出轨,喜欢花钱,喜欢买包包,手表,GUCCI,chanel...家里的钱败光了,还剩下{}".format(money))10

11 defmeimei_hobby():12 nonlocal money13 money -= 399

14 print("我就喜欢在宝马里面哭,不喜欢在自行车上面撒欢~...家里的钱败光了,还剩下{}".format(money))15

16 defbig_master():17 return[jiejie_hobby,meimei_hobby]18

19 #def func():

20 #print(jiejie)

21 #return func

22

23 returnbig_master24

25

26 func =liangruiqing_family()27 #获取姐姐函数

28 jiejie =lst[0]29 jiejie() #家里的钱败光了,还剩下400

30 #获取妹妹函数

31 meimei = lst[1]32 meimei() 家里的钱败光了,还剩下1

View Code

3.闭包的特点

互相嵌套的两个函数形成了闭包;内函数使用了外函数的局部变量,

该变量与内函数发生绑定,延长该变量的生命周期,直到该脚本运行结束.

defouter(val):definner(num):return val +numreturninner

func= outer(10)

res= func(5)print(res) #15

4.闭包的意义

在做计数加1的过程当中,发现全局变量的值范围太大,导致可以被任意篡改,数据不安全

clicknum =0deffunc():globalclicknum

clicknum+= 1

print(clicknum)

func()

func()

func()

clicknum= 100func()#101

出现的问题:单纯的局部变量不能累加1,

defclicknum():

x=0

x+= 1

print(x)

clicknum()

clicknum()

clicknum()

闭包的意义:

闭包可以优先使用外函数中的变量,并对闭包中的值起到了封装保护的作用.外部无法访问

defclicknum():

x=0deffunc():

nonlocal x

x+= 1

print(x)returnfunc

func= clicknum() #func = 闭包函数func

func()

func()

x= 100func()#3

10.匿名函数

用一句话来表达只有返回值的函数叫做匿名函数

语法:  lambda 参数 : 返回值

(1)无参的匿名函数

deffunc():return "我是func1111"res=func()print(res)#lambda 改造

func = lambda : "我是func1111"

print(func())

(2) 有参的匿名函数

deffunc(num):returntype(num)

res= func([1,2,3])print(res)#lambda 改造

func = lambdanum : type(num)print(func({"a":"1",'b':2}))

(3) 带有判断条件的匿名函数

三元(目)运算符 (只能在双向分支上可以使用,单项多项都不行)

语法: 真值 if 条件表达式 else 假值 => 如果条件表达式是真的,返回真值,否则返回假值

deffunc(num):if num % 2 ==0:return "偶数"

else:return "奇数"res= func(11)print(res)#lambda 改造

print("<=================>")

func= lambda num : "奇数" if num % 2 == 1 else "偶数"

print(func(102))

三.locals() 和 globals()

1.locals() 获取当前作用域的变量

在函数外,获取的是打印之前所有全局变量

在函数内,获取的是调用之前所有局部变量

#1.在函数外

a = 1b= 2dic=locals()

c= 3

print(dic) #a b c 都要打印

#2.在函数内

deffunc():

a= 1b= 2dic=locals()

c= 3

print(dic)

d= 4f= 5func()##打印 a b

g = 6

2 . globals() 获取全局变量

在函数外,获取的是打印之前所有全局变量

在函数内,获取的是调用之前所有全局变量

#1.在函数外

a = 1b= 2dic=globals()

c= 3

print(dic) ## a b c 都要打印

#2.在函数内

deffunc():

a= 1b= 2dic=globals()

c= 3

print(dic)

d= 4f= 5func()## 只打印 f

g = 6

3 .利用globals批量创建全局变量

globals实现,通过字符串创建一个全局变量

globals返回的是系统内置的一个字典

通过往内置字典中添加键值对,实现全局变量的创建

dic =globals()#通过往内置字典中添加键值对,实现全局变量的创建

dic["wangwen"] = "王文"

print(dic)print(wangwen) #"王文"

四、迭代器

迭代器:能被next()函数调用并不断返回下一个值的对象称为迭代器(Iterator  迭代器是对象)

概念:迭代器指的是迭代取值的工具,迭代是一个重复的过程,每次重复都是基于上一次的

结果而继续的,单纯的重复并不是迭代

特征:并不依赖索引,而通过next指针(内存地址寻址)迭代所有数据,一次只取一个值,

而不是一股脑的把所有数据放进内存.大大节省空间

1、 可迭代性对象

如果一个对象中含有__iter__这个成员,说明该数据是可迭代性对象;

ps:查看该对象中的成员,dir

setvar = {"白金鸽","杨特","郝建康"}#查看该对象中的成员,dir

lst =dir(setvar)if '__iter__' inlst:print("该数据是可迭代性数据")print(lst)

2、 迭代器

如果是迭代器,一定是可迭代对象

如果是可迭代对象,不一定是迭代器;

1.如何变成一个迭代器

setvar = {"白金鸽","杨特","郝建康"}#1.如何变成一个迭代器

it = iter(setvar) #方法一

it = setvar.__iter__() #方法二

lst =dir(it)print(lst)

2.如何判断一个迭代器 __iter__ + __next__

if "__iter__" in lst and "__next__" inlst:print("该数据是迭代器")

3.如何调用一个迭代器

1 #方法一

2 res =next(it)3 print(res)4 res =next(it)5 print(res)6 res =next(it)7 print(res)8 #res = next(it) error

9 #print(res)

10

11 #4.重置迭代器

12 it =iter(setvar)13 #res = next(it)

14 res = it.__next__()15 print(res)16

17 #方法二

18 print("<=========>")19 for i init:20 print(i)21 #next(it) error 单项不可逆的过程

22

23 #方法三

24 print("<=========>")25 setvar = {"白金鸽","杨特","郝建康","于盛林","杨业","王娟娟","草配线","孟凡伟"}26 it = iter(setvar) #setvar.__iter__()

27 for i in range(8):28 print(next(it))

View Code

五、高阶函数

高阶函数 : 能够把函数当成参数传递的就是高阶函数

1、map(func,Iterable) : 处理数据

功能:

把Iterable中的数据一个一个的传递到func函数当中进行处理,处理之后的结果通过迭代器一个一个获取

参数:

func:内置或者自定义函数

Iterable : 可迭代性数据(容器类型数据 range对象 迭代器)

返回值:

迭代器

#(1) ["1","2","3","4"] => [1,2,3,4]

lst = ["1","2","3","4"]

lst_new=[]for i inlst:#print(int(i))

lst_new.append(int(i))print(lst_new)#使用map改写

it =map(int,lst)for i init:print(i,type(i))print(list(it))

#(2) [1,2,3,4] => [5,10,15,20]

lst = [1,2,3,4]

lst_new=[]for i inlst:

res= i * 5lst_new.append(res)print(lst_new)#使用map改写

"""注意点 : 参数和返回值必不可少"""

deffunc(n):print(1111111111)return n * 5it= map(func,lst)

2、reduce(func,Iterable)  计算数据

功能:

先把Iterable中的前两个数据拿出来,扔到func中做处理,得出一个结果,

在拿当前结果和Iterable的下一个值在继续扔到func做计算,

依次类推...

直到最后返回结果.

参数:

func : 自定义函数

Iterable : 可迭代性对象(容器类型数据 , range对象 , 迭代器)

返回值:

计算最后的结果

#(1) [5,4,8,8] => 5488

from functools importreducedeffunc(x,y):return x*10 +y

lst= [5,4,8,8]

res=reduce(func,lst)print(res,type(res))#lambda 改造

print(reduce( lambda x,y : x*10 + y , lst))

#(2) "5488" => 5488 不让使用int函数

deffunc(x,y):return x*10 +ydeffunc2(n):

dic={}for i in range(10):

dic[str(i)]=ireturndic[n]#功能: "5488" => 5,4,8,8

it = map(func2,"5488")#功能: [5,4,8,8] => 5488

res =reduce(func,it)print(res , type(res))

3、filter(func,Iterable)  过滤数据

功能:

通过自定函数的返回值控制当前数据保留与否

return True 代表保留

return False 代表舍弃

参数:

func : 自定义的函数

Iterable : 可迭代性数据(容器类型数据,range对象,迭代器)

返回值:

迭代器

#lst = [1,12,435,234,122,2] => 过滤掉偶数,保留奇数

lst = [1,12,435,234,122,2]

lst_new=[]for i inlst:if i % 2 == 1:

lst_new.append(i)print(lst_new)#使用filter进行改造

deffunc(n):if n % 2 == 1:returnTrueelse:returnFalse

it=filter(func,lst)

lst=list(it)print(lst)#使用lambda 进行改造

print(list(filter( lambda n : True if n % 2 == 1 else False , lst )))

4、sorted(Iterable , reverse=False , key = 函数)

功能:

排序数据

参数:

Iterable : 可迭代对象 (容器类型数据 range对象 迭代器)

reverse : 正序或者倒序 reverse = False (从小到大)

key : 内置或者自定义方法

返回值:

排序后的数据(列表)

#1.从小到大

lst = [-9,18,13,16,99,87]

res=sorted(lst)print(res)#2.从大到小

res = sorted(lst,reverse=True)print(res)

sort 和 sorted的区别:

[sorted] 推荐

1.sorted 可以对所有的容器类型数据排序

2.返回一个新的列表

[sort]

1.sort 只能对列表这一个类型进行排序

2.针对于原有的列表进行排序

六 、推导式

概念: 通过一行循环判断,遍历出一系列数据的方法就是推导式

推导式种类三种:

[val for val in Iterable] 列表推导式

{val for val in Iterable} 集合推导式

{a:b for a,b in iterable} 字典推导式

1.列表推导式

1.单循环推导式基本语法

#创建列表,内容为1~50

lst = [ i for i in range(1,51) ]print(lst)

2.带有判断条件的单循环推导式

注意点: 在循环后面只能跟单项分支

#1 ~ 100 中的所有偶数保留到列表里

lst =[]for i in range(1,101):if i % 2 ==0 :

lst.append(i)print(lst)#改写推导式

lst = [ i for i in range(1,101) if i % 2 ==0 ]print(lst

3.多循环推导式基本语法

lst1 = ["于盛林","荷叶","王永娟"]

lst2= ["李琦","朱培峰","刘灵镇"]

lst=[]for i inlst1:for j inlst2:

lst.append(i+ "♠" +j)print(lst)#改写推导式

lst = [ i + "♠" + j for i in lst1 for j inlst2 ]print(lst)

4.带有判断条件的多循环推导式

lst =[]for i inlst1:for j inlst2:if lst1.index(i) ==lst2.index(j):

lst.append(i+ "♠" +j)print(lst#改写推导式

lst = [ i + "♠" + j for i in lst1 for j in lst2 if lst1.index(i) ==lst2.index(j) ]print(lst)

2.集合推导式

"""案例:

满足年龄在18到21,存款大于等于5000 小于等于5500的人,

开卡格式为:尊贵VIP卡老x(姓氏),否则开卡格式为:抠脚大汉卡老x(姓氏)

把开卡的种类统计出来"""data=[

{"name":"李琦","age":22,"money":20000},

{"name":"李雅琪","age":19,"money":12000},

{"name":"吴洪昌","age":18,"money":5300},

{"name":"王召","age":80,"money":4000},

{"name":"王生父","age":81,"money":5400}

]

setvar=set()for i indata:if 18 <= i["age"] <= 21 and 5000 <= i["money"] <= 5500:

strvar= "尊贵VIP卡老{}".format(i["name"][0])else:

strvar= "抠脚大汉卡老{}".format(i["name"][0])#把对应的开卡格式存入到集合当中

setvar.add(strvar)print(setvar)#改写成集合推导式#三运运算符 + for循环 => 集合推导式

setvar = { "尊贵VIP卡老{}".format(i["name"][0]) if 18 <= i["age"] <= 21 and 5000 <= i["money"] <= 5500 else "抠脚大汉卡老{}".format(i["name"][0]) for i indata }print(setvar)

View Code

3.字典推导式

(1)enumerate

enumerate(iterable,[start=0])

功能:  枚举 ; 将索引号和iterable中的值,一个一个拿出来配对组成元组,通过迭代器返回

参数:

iterable: 可迭代性数据 (常用:迭代器,容器类型数据,可迭代对象range)

start: 可以选择开始的索引号(默认从0开始索引)

返回值: 迭代器

lst = ["欢庆","尤佳","刘文波","黄长剑"]

it= enumerate(lst) #默认从0开始索引

it = enumerate(lst,start=1) #start = 1表示从1开始枚举配对;

#1.配合enumerate完成字典推导式操作

dic = { k:v for k,v inenumerate(lst) }print(dic)#2.直接通过dict强转

dic =dict(enumerate(lst))print(dic)

(2)zip(iterable, ... ...)

功能: 将多个iterable中的值,一个一个拿出来配对组成元组,通过迭代器返回

iterable: 可迭代性数据 (常用:迭代器,容器类型数据,可迭代对象range)

返回: 迭代器

原则: zip的配对原则会按照相同的索引组合,如果没有相同的索引自动舍弃;

#1.配合zip完成字典推导式操作

lst_key = ["zy","sxy","jyh"]

lst_val= ["张印","孙翔宇","家营和"]

dic= { k:v for k,v inzip(lst_key,lst_val) }print(dic)#2.直接通过dict强转

dic =dict(zip(lst_key,lst_val))print(dic)

七、生成器

生成器本质是迭代器,允许自定义逻辑的迭代器

迭代器和生成器区别:

迭代器本身是系统内置的.重写不了.而生成器是用户自定义的,可以重写迭代逻辑

生成器可以用两种方式创建:

(1)生成器表达式 (里面是推导式,外面用圆括号)

(2)生成器函数 (用def定义,里面含有yield)

1、生成器表达式

#生成器表达式

gen = (i for i in range(100))print(gen) #generator

#调用生成器#1.next

res =next(gen)print(res)#2.for + next (推荐)

for i in range(3):print(next(gen))#3.for (慎用,防止数据量较大时,形成类似于死循环的效果)#for i in gen:

#print(i)

#4.list (慎用,防止数据量较大时,内存溢出,出现蓝屏)

lst =list(gen)print(lst)

2、生成器函数

yield 类似于 return

共同点在于:执行到这句话都会把值返回出去

不同点在于:yield每次返回时,会记住上次离开时执行的位置 , 下次在调用生成器 , 会从上次执行的位置往下走

而return直接终止函数,每次重头调用.

1.生成器函数语法

defmygen():print("one")yield 1

print("two")yield 2

print("three")yield 3

#初始化生成器函数 => 返回生成器对象 , 简称生成器

gen =mygen()

res= next(gen)

2.生成器优化写法

defmygen():for i in range(1,101):yield "新制造的篮球球衣号码是{}".format(i)#初始化生成器函数 => 返回生成器对象 , 简称生成器

gen =mygen()#先获取前30个数据

for i in range(30):print(next(gen))

3.send语法的使用

send send发送值的时候,是给上一个yield

next和send区别:

next 只能取值

send 不但能取值,还能发送值

send注意点:

第一个 send 不能给 yield 传值 默认只能写None

最后一个yield 接受不到send的发送值

1 defmygen():2 print("start ...")3 res = yield "111"

4 print(res)5

6 res = yield "222"

7 print(res)8

9 res = yield "333"

10 print(res)11

12 res = yield "444"

13 print(res)14 print("end ...")15

16 #初始化生成器函数 => 返回生成器对象 , 简称生成器

17 gen =mygen()18 #第一次发送数据时,无脑加None

19 res =gen.send(None)20 print(res)21 res = gen.send("我来了老妹2")22 print(res)23 res = gen.send("我来了老妹3")24 print(res)25 res = gen.send("我来了老妹4")26 print(res)27 #res = gen.send("我来了老妹5") error

28 #print(res)

View Code

4. yield from 的基本使用

yield from : 将一个可迭代对象变成一个迭代器返回

defmygen():#yield [1,2,3,4,5]

yield from [1,2,3,4,5]

gen=mygen()print(next(gen))print(next(gen))print(next(gen))print(next(gen))

python123第九周_我的python学习之路-基础3相关推荐

  1. 我的python学习之路_我的Python学习之路

    简单算来,接触Python有些时日了.想要做个简单的总结,算是为想要入门Python的童鞋做一个简单的介绍吧. 什么是Python Python,是一种面向对象.直译式的计算机程序语言.它包含了一组功 ...

  2. python 异常处理模块_我的python学习之路-异常处理和模块导入

    本节摘要 一.模块导入 二.导入包 三.异常处理 一.模块导入 文件就是一个模块,文件夹就是一个包 文件夹里面可以有很多文件,就相当于包中有好多的模块. 1.import 引入 模块不会被重复导入,引 ...

  3. python学习之路基础篇(第四篇)

    一.课程内容回顾 1.python基础 2.基本数据类型  (str|list|dict|tuple) 3.将字符串"老男人"转换成utf-8 s = "老男人" ...

  4. python学习之路基础篇(第八篇)

    一.作业(对象的封装) 要点分析 1.封装,对象中嵌套对象 2.pickle,load,切记,一定要先导入相关的类二.上节内容回顾和补充 面向对象基本知识: 1.类和对象的关系 2.三大特性: 封装 ...

  5. Python学习之路基础篇--10Python基础,函数进阶

    1 命名空间 对于Python 来说命名空间一共有三种 1 内置命名空间 -- Python 解释器 就是Python 解释器一启动就可以使用的名字,储存在内置命名空间中.内置的名字在启动解释器的时候 ...

  6. Python学习之路-基础知识1

    永远的Hello World! print("Hello World!") >>Hello World! 数据类型 Number类型: 数值类型,用于存储数字 Inte ...

  7. Python学习之路-基础知识2-文件操作

    文件操作     现有文件test.txt内容如下: 床前明月光, 疑是地上霜. 举头望明月, 低头思故乡. >>>f = open("test.txt",&qu ...

  8. python之路 mysql 博客园_教为学:Python学习之路(二):MySQLdb的几种安装方式,以及用Python测试连接MySql...

    教为学:Python学习之路(二):MySQLdb的几种安装方式,以及用Python测试连接MySql Easy_install安装MySQLdb 很简单,以至于我不晓得该怎么说.一句话. sodu ...

  9. Python学习之路9☞面向对象的程序设计

    Python学习之路9☞面向对象的程序设计 一 面向对象的程序设计的由来 见概述:http://www.cnblogs.com/linhaifeng/articles/6428835.html 二 什 ...

  10. python学习课程 0基础学Python视频教程

    python学习课程,零基础Python初学者应该怎么去学习Python语言编程?python学习路线这里了解一下吧.想python学习课程?学习路线网免费下载海量python教程,上班族也能在家自学 ...

最新文章

  1. android手机可以设置屏幕锁定,安卓手机屏幕锁设置方法(九个点图案)
  2. 计算机专业英语第三章在线测试,《计算机专业英语》第03章在线测试
  3. 【差分隐私的指数机制该怎么理解?】差分隐私系统学习记录(三)
  4. vlan跨交换机 udp广播_网络交换VLAN基础入门
  5. ISA2006之SP1的作用
  6. 最小标示法模板 poj1509
  7. Linux查询命令帮助语句,linux有关命令的帮助和用法查看
  8. java 文件读取大全
  9. 10.机器学习sklearn-------手写数字识别实例
  10. fcm算法的MATLAB实现
  11. mysql 数据库恢复模式_数据库的恢复模式
  12. 计算机文件夹无法排序,文件夹下文件不能手动调整顺序?-开启Windows 7文件/文件夹手动排序功能...
  13. 吴裕雄--天生自然 诗经:鹊踏枝·谁道闲情抛弃久
  14. 无损批量合并视频 附工具
  15. 计算机二级有没有年龄,九龄童通过全国计算机二级 创年龄最小纪录(图)_新闻中心_新浪福建_新浪网...
  16. SLCP认证辅导,SLCPCAFv1.4和v1.3相比较共同之处在哪
  17. Thingsboard Build踩坑(一)
  18. 浅谈网站黑链检测和清除的方法
  19. C语言中的截断与整型提升
  20. 百度智能云对象存储BOS批量下载文件方法

热门文章

  1. 微博话题墙 html,Js仿微博插入话题功能
  2. ATmega16 单片机 AVR单片机 自动计价电子秤
  3. Nebula Graph - SpringBoot 操作 Nebula
  4. 布鲁特-福斯算法(字符串匹配)
  5. Qt交叉编译移植arm开发板
  6. eclipse项目名前出现红色感叹号,小红叉解决(转)
  7. “行走的广告牌”——椰树牌椰汁
  8. Python数据分析学习 二
  9. Routh-Hurwitz Criterion 劳斯稳定判据
  10. 科学计算机怎么表示大括号,电脑上大括号怎么拉长