Python函数和列表生成式和生成器

一、例题讲解与分析

1、例题:

def f(x,l=[ ])
    for i in range (x):
         l.append(i*i)
    print(l)

求:
f(2)
f(3,[3,2,1])
f(3)

结果如下:
这里写图片描述

分析:
1、上题中先申明一个函数,第一个参数是整型, 第二个参数是list类型
2、l 有一个默认值,默认值为[]空列表,例如f(2) =f(2,l=[])
3、f(2)代入后求0和1的平方(i*i的值),往列表后插入,既结果为[0,1];f(3,[3,2,1])代入后结果既为[3, 2, 1, 0, 1,4],在列表后插入0、1、2的平方的值;f(3)代入后既会在列表后插入0、1、2的平方的值,而因为系统中内存会保留上面f(2)代入后的值,所以f(3)值为[0,1, 0, 1, 4]。

如果需要精确单独求某个值,上面的题我们也可以写成如下:
求:
f(2, l=[])
f(3,[3,2,1])
f(3, l=[])
结果如下:
这里写图片描述

二、函数的复习
函数的关键字:
def 定义函数
return 返回这
pass 滤过
exit(1) 直接退出

举例 (return):

def add1(x, y):
    print(x+y)
def add2(x, y):
    return x+y

结果如下:
这里写图片描述

分析:  
1、add1是直接调用即可返回值
2、add2是需要先定义一个result的值才可打印出返回值

举例 (pass、exit):

def hello():
    pass
def hello():
    exit(1)
    print("hello")

分析:  
1、pass是略过的意思,一般用来重写别人的函数。
2、exit直接退出,后面的代码不会执行或输出。

函数的参数:
*args   tuple参数,对应赋值
**kwargs  dict参数,对应赋值

举例( fun(*args, **kwargs) ):

fun(*args, **kwargs)
fun(1, 2, 3, 4, 5, a=10, b=40)args =(1,2,3,4,5) 
kwargs =dicta=10,b=40)
def test(m, *args, **kwargs):
    print("m = {0}".format(m))
    print("args = {0}".format(args))
    print("kwargs = {0}".format(kwargs))

test(10, 1, 2, 3)
输出结果:
这里写图片描述

匿名函数:

add = lambda x,y:x+y

高阶函数:

1、Python中已经写好的函数。但一般建议自己需要时写。
2、都是可以通过代码逻辑实现的
3、但是你写的函数的负责程序,或者算法不一定有人家内置的好

举例 map:

def f(x):
    return x*x
print(list((map(f, [1, 2, 3, 4]))))
for i in map(f, [1, 2, 3, 4]):
    print(i)

map代表list的值[1,2,3,4]每执行一次传给f然后再执行return返回值。

结果如下:
这里写图片描述

也可以类似map自行写出逻辑函数:

def f(x):
    return x*x
def testMap(fun, iter):
    l = list()
    for i in iter:
        l.append(fun(i))
    return l

print(testMap(f, [1, 2, 3, 4]))

结果如下:
这里写图片描述

sorted函数:

sorted(iterable, key, reverse)  
iterable   一个可迭代的对象
key    对什么进行排序 reverse
bool类型,如果为true为反序, 默认为false  
返回值是一个list

举例1 sorted:
print(sorted([1, 4, 342, 3, 45, 76, 435, 34], reverse=True))
结果:
这里写图片描述

分析:  
1、reverse=True时为反序,不加则为默认正排序。

举例2 sorted:

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])))

结果:
这里写图片描述

分析:  
1、返回m的字典的值。
2、items,默认对字典中的第一个序列进行排序。
3、lambda中的第一个x为一个元组,第二个x如果为0则以key排序,1为value排序。
4、并使用dict进行强制转化为字典。

字典有三种初始化的方法:

d1 = dict(a=1, b=2)
d2 = {“a”: 1, “b”: 2}  
d3 = dict([(“a”, 1), (“b”, 2)]) print(d1, d2, d3)

三、列表生成式和生成器
列表生成式
[exp for val in collection if condition]

生成器
方法一:
(exp for val in collection if condition)

举例 (列表生成式):九宫格

def jgg():
    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]:
                    print("A = {0} B = {1}  C = {2} D = {3}".format(A, B, C, D))
jgg()

结果如下:
这里写图片描述

举例 (方法一 生成器):

a1 = (x for x in range(1, 10) if x%2==0)
print(a1)
print(next(a1))
print("##"*10)
for i in a1:
    print(i)

结果:
这里写图片描述

使用next函数后,下次执行遍历就会从2之后的4开始执行。

举例 (方法二 生成器):

return和yield的区别
yield 可以理解成return,但是比return多一些角色 yiele
每次都返回,但是下一次取值时,从上一次yield的下一行开始

def test():
    a = 1
    for i in range(1, 10):
        yield i
        # return i
        a += 1
        # return i

三、习题:对文件/etc/passwd进行以uid列排序

def px(item):
    pass
result = ""
with codecs.open("passwd", "r") as f:
    result = sorted(f.readlines(), key=lambda item: int(item.split(":")[2]))

with codecs.open("sortPasswd", "w") as f:
    f.writelines(result)

分析:  
1、执行后会生成结果到一个新的文件sortPasswd。

这里写图片描述

猜你喜欢

转载自blog.csdn.net/oqqalex123456789d/article/details/79952591