笔记:Python的函数类,列表生成式和生成器
一、Python的函数类
#!/usr/bin/env python# -*- coding: utf-8 -*-# @Time : 2018/4/14 20:09# @Author : lingxiangxiang# @File : demon1.py# 申明一个函数,第一个参数是整型, 第二个参数是list类型,# l 有一个默认值,默认值为[]空列表def f(x,l=[]): for i in range(x): l.append(i*i) print(l)# f(2) = f(2, l=[])f(2)# 输出什么[0, 1]f(3,[3,2,1])# 结果: [3, 2, 1, 0, 1, 4]f(x=3, l=[])# 结果: [0, 1, 4]
函数的关键字 def 定义函数 return 返回这 pass 滤过 exit(1) 直接退出
#!/usr/bin/env python# -*- coding: utf-8 -*-# @Time : 2018/4/14 20:22# @Author : yangyuanqiang# @File : demon2.pydef add1(x, y): print(x+y)
add1(1, 2) #传参,1,2的参数
以上实例输出的结果
3 #直接输出
#!/usr/bin/env python# -*- coding: utf-8 -*-# @Time : 2018/4/14 20:22# @Author : yangyuanqiang# @File : demon2.pydef add2(x, y): return x + y #返回值result = add2(1, 2) #调用函数传参,赋值给result变量,再执行print打印print(result)
以上实例输出的结果
3
#!/usr/bin/env python# -*- coding: utf-8 -*-# @Time : 2018/4/14 20:22# @Author : yangyuanqiang# @File : demon2.pydef hello(): pass #过滤 print("hello")hello()
以上实例输出的结果
hello
#!/usr/bin/env python# -*- coding: utf-8 -*-# @Time : 2018/4/14 20:22# @Author : yangyuanqiang# @File : demon2.pydef helloworld(): exit(1) #直接退出 print("hello world")helloworld()
以上实例输出的结果
#exit(1)直接退出,所以不会执行下面的结果
函数的参数 *args tuple参数,对应赋值 **kwargs dict参数,对应赋值 fun(*args, **keargs) fun(1, 2, 3, 4, 5, a=10, b=40) args = (1, 2, 3, 4, 5) keargs = (a=10, b=40)
#!/usr/bin/env python# -*- coding: utf-8 -*-# @Time : 2018/4/14 20:22# @Author : yangyuanqiang# @File : demon2.pydef test(m, *args, **kwargs): print("m = {0}".format(m)) print("args = {0}".format(args)) print("kwargs = {0}".format(kwargs))test(10,1,11,12,a=10,b=20)
以上实例输出的结果
m = 10args = (1, 11, 12)kwargs = { 'b': 20, 'a': 10}
匿名函数 def add(x, y): return x + y add = lambda x,y:x + y
高阶函数 装逼函数 都是可以通过代码逻辑实现的。 都是可以通过代码逻辑实现的 但是你写的函数的负责程序,或者算法不一定有人家内置的好
#!/usr/bin/env python# -*- coding: utf-8 -*-# @Time : 2018/4/14 20:38# @Author : yangyuanqiang# @File : demon3.pydef f(x): return x*xprint(map(f, [1, 2, 3, 4]))print(list((map(f, [1, 2, 3, 4])))) #强制转换成列表for i in map(f, [1, 2, 3, 4]): print(i)
以上实例输出的结果
#!/usr/bin/env python# -*- coding: utf-8 -*-# @Time : 2018/4/14 20:38# @Author : yangyuanqiang# @File : demon33.pydef add(x, y): return x+yprint(reduce(add, [1, 2, 3, 4, 5, 6]))# 1, 2 = 3# 3, 3 = 6# 6, 4 = 10# 10, 5 = 15# 15, 6 = 21输出的结果为:21
唯一用的比较多的,就是sorted sorted(iterable, key, reverse) iterable 一个可迭代的对象 key 对什么进行排序 reverse bool类型,如果为true为反序, 默认为false 返回值是一个list
print(sorted([1, 4, 342, 3, 45, 76, 435, 34], reverse=True))结果为:[435, 342, 76, 45, 34, 4, 3, 1]
m = dict(a=1, c=10, b=20, d=15)print(m)print(sorted(m.items()))print(sorted(m.items(), key=lambda x: x[0]))print(dict(sorted(m.items(), key=lambda x: x[1])))print(sorted(m.items(), key = lambda d:d[1], reverse = True))
以上实例输出的结果
{ 'b': 20, 'c': 10, 'a': 1, 'd': 15}[('a', 1), ('b', 20), ('c', 10), ('d', 15)][('a', 1), ('b', 20), ('c', 10), ('d', 15)]{ 'b': 20, 'a': 1, 'c': 10, 'd': 15}[('b', 20), ('d', 15), ('c', 10), ('a', 1)]
字典有三种初始化的方法
d1 = dict(a=1, b=2)d2 = { "a": 1, "b": 2}d3 = dict([("a", 1), ("b", 2)])print(d1, d2, d3)
以上实例输出的结果
{ 'b': 2, 'a': 1} { 'b': 2, 'a': 1} { 'b': 2, 'a': 1}
二、列表生成式和生成器
1、列表生成式
列表生成式 [exp for val in collection if condition]
以九宫格为例:
#!/usr/bin/env python# -*- coding: utf-8 -*-# @Time : 2018/4/14 21:34# @Author : yangyuanqiang# @File : demon4.py'''列表生成式生成器'''# 列表生成式def jgg(): count = 1 number = list() for i in range(1, 10): number.append(i) for A in [x for x in range(1, 10)]: for B in [x for x in range(1, 10) if x != A]: for C in [x for x in range(1, 10) if x != A and x != B]: for D in [x for x in range(1, 10) if x != A and x != B and x != C]: for E in [x for x in range(1, 10) if x != A and x != B and x != C and x != D]: for F in [x for x in range(1, 10) if x != A and x != B and x != C and x != D and x != E]: for G in [x for x in range(1, 10) if x != A and x != B and x != C and x != D and x != E and x != F]: for H in [x for x in range(1, 10) if x != A and x != B and x != C and x != D and x != E and x != F and x != G]: for I in [x for x in range(1, 10) if x != A and x != B and x != C and x != D and x != E and x != F and x != H]: # print("A = {0} B = {1} C = {2} D = {3} E = {4} F = {5} G = {6} H = {7} I {8}".format(A, B, C, D, E, F, G, H, I)) if (A + B + C == D + E + F == G + H + I == A + D + G == B + E + H == C + F + I == A + E + I == G + E + C == 15): print(''' 第{9}种例子 ------------- | {0} | {1} | {2} | | {3} | {4} | {5} | | {6} | {7} | {8} | -------------'''.format(A, B, C, D,E, F, G, H,I, count)) count += 1jgg()
以上实例输出的结果
第1种例子 ------------- | 2 | 7 | 6 | | 9 | 5 | 1 | | 4 | 3 | 8 | ------------- 第2种例子 ------------- | 2 | 9 | 4 | | 7 | 5 | 3 | | 6 | 1 | 8 | ------------- 第3种例子 ------------- | 4 | 3 | 8 | | 9 | 5 | 1 | | 2 | 7 | 6 | ------------- 第4种例子 ------------- | 4 | 9 | 2 | | 3 | 5 | 7 | | 8 | 1 | 6 | ------------- 第5种例子 ------------- | 6 | 1 | 8 | | 7 | 5 | 3 | | 2 | 9 | 4 | ------------- 第6种例子 ------------- | 6 | 7 | 2 | | 1 | 5 | 9 | | 8 | 3 | 4 | ------------- 第7种例子 ------------- | 8 | 1 | 6 | | 3 | 5 | 7 | | 4 | 9 | 2 | ------------- 第8种例子 ------------- | 8 | 3 | 4 | | 1 | 5 | 9 | | 6 | 7 | 2 | -------------
2、生成器
生成器 方法一: (exp for val in collection if condition) 方法二:
#!/usr/bin/env python# -*- coding: utf-8 -*-# @Time : 2018/4/14 21:34# @Author : yangyuanqiang# @File : demon4.pya1 = (x for x in range(1, 10) if x%2==0)print(a1)# python2 a1.next()print(next(a1)) #python3 是直接调用next方法print("##"*5) #输出10个*for i in a1: print(i)
以上实例输出的结果
at 0x102081b48>2##########468
a2 = [x for x in range(1, 10) if x%2==0] #列表形式print(a2)
以上实例输出的结果
[2, 4, 6, 8]
#!/usr/bin/env python# -*- coding: utf-8 -*-# @Time : 2018/4/14 21:34# @Author : yangyuanqiang# @File : demon4.pydef test(): a = 1 for i in range(1, 10): yield i # return i a += 1 # return i#return和yield的区别# yield 可以理解成return,但是比return多一些角色# yiele 每次都返回,但是下一次取值时,从上一次yield的下一行开始m = test()print(m)
以上实例输出的结果
练习题
对/etc/passwd文件排序操作,以uid用户ID号进行排序,输出的结果: root:x:0:0:root:/root:/bin/bash bin:x:1:1:bin:/bin:/sbin/nologin daemon:x:2:2:daemon:/sbin:/sbin/nologin adm:x:3:4:adm:/var/adm:/sbin/nologin
passwd文件内容:
adm:x:3:4:adm:/var/adm:/sbin/nologinlp:x:4:7:lp:/var/spool/lpd:/sbin/nologinsync:x:5:0:sync:/sbin:/bin/syncshutdown:x:6:0:shutdown:/sbin:/sbin/shutdownhalt:x:7:0:halt:/sbin:/sbin/haltroot:x:0:0:root:/root:/bin/bashbin:x:1:1:bin:/bin:/sbin/nologindaemon:x:2:2:daemon:/sbin:/sbin/nologinmail:x:8:12:mail:/var/spool/mail:/sbin/nologinoperator:x:11:0:operator:/root:/sbin/nologingames:x:12:100:games:/usr/games:/sbin/nologinftp:x:14:50:FTP User:/var/ftp:/sbin/nologinnobody:x:99:99:Nobody:/:/sbin/nologinavahi-autoipd:x:170:170:Avahi IPv4LL Stack:/var/lib/avahi-autoipd:/sbin/nologinsystemd-bus-proxy:x:999:997:systemd Bus Proxy:/:/sbin/nologinsystemd-network:x:998:996:systemd Network Management:/:/sbin/nologindbus:x:81:81:System message bus:/:/sbin/nologinpolkitd:x:997:995:User for polkitd:/:/sbin/nologintss:x:59:59:Account used by the trousers package to sandbox the tcsd daemon:/dev/null:/sbin/nologinpostfix:x:89:89::/var/spool/postfix:/sbin/nologinsshd:x:74:74:Privilege-separated SSH:/var/empty/sshd:/sbin/nologinntp:x:38:38::/etc/ntp:/sbin/nologinnscd:x:28:28:NSCD Daemon:/:/sbin/nologintcpdump:x:72:72::/:/sbin/nologinnginx:x:1000:1000::/home/nginx:/sbin/nologinzabbix:x:996:994:Zabbix Monitoring System:/var/lib/zabbix:/sbin/nologin
#!/usr/bin/env python# -*- coding: utf-8 -*-# @Time : 2018/4/15 17:10# @Author : yangyuanqiang# @File : 用户列表排序.py'''对/etc/passwd文件排序操作,以uid用户ID号进行排序,输出的结果:root:x:0:0:root:/root:/bin/bashbin:x:1:1:bin:/bin:/sbin/nologindaemon:x:2:2:daemon:/sbin:/sbin/nologinadm:x:3:4:adm:/var/adm:/sbin/nologin'''import codecsdef px(item): pass #滤过result = "" #空字符串with codecs.open("passwd", "r") as f: #读取文件,自动关闭文件 result = sorted(f.readlines(), key=lambda item: int(item.split(":")[2])) #f.readlines() 一行一行的读,key=lambda 匿名函数,int整数,split进行切片,以":"为分隔符,取第三列uidwith codecs.open("sortPasswd", "w") as f: #写入到新的文件中 f.writelines(result) #一行一行的写入到文件中
以上实例输出的结果:在当前目录下生成 sortPasswd文件,内容如下:
root:x:0:0:root:/root:/bin/bashbin:x:1:1:bin:/bin:/sbin/nologindaemon:x:2:2:daemon:/sbin:/sbin/nologinadm:x:3:4:adm:/var/adm:/sbin/nologinlp:x:4:7:lp:/var/spool/lpd:/sbin/nologinsync:x:5:0:sync:/sbin:/bin/syncshutdown:x:6:0:shutdown:/sbin:/sbin/shutdownhalt:x:7:0:halt:/sbin:/sbin/haltmail:x:8:12:mail:/var/spool/mail:/sbin/nologinoperator:x:11:0:operator:/root:/sbin/nologingames:x:12:100:games:/usr/games:/sbin/nologinftp:x:14:50:FTP User:/var/ftp:/sbin/nologinnscd:x:28:28:NSCD Daemon:/:/sbin/nologinntp:x:38:38::/etc/ntp:/sbin/nologintss:x:59:59:Account used by the trousers package to sandbox the tcsd daemon:/dev/null:/sbin/nologintcpdump:x:72:72::/:/sbin/nologinsshd:x:74:74:Privilege-separated SSH:/var/empty/sshd:/sbin/nologindbus:x:81:81:System message bus:/:/sbin/nologinpostfix:x:89:89::/var/spool/postfix:/sbin/nologinnobody:x:99:99:Nobody:/:/sbin/nologinavahi-autoipd:x:170:170:Avahi IPv4LL Stack:/var/lib/avahi-autoipd:/sbin/nologinzabbix:x:996:994:Zabbix Monitoring System:/var/lib/zabbix:/sbin/nologinpolkitd:x:997:995:User for polkitd:/:/sbin/nologinsystemd-network:x:998:996:systemd Network Management:/:/sbin/nologinsystemd-bus-proxy:x:999:997:systemd Bus Proxy:/:/sbin/nologinnginx:x:1000:1000::/home/nginx:/sbin/nologin