2018-04-14周6课程笔记

高阶函数

def f(x):
    return x*x
#map(f, list)# 返回每个元素通过f计算完的value的list
#map(f, [1, 2, 3, 4])
print(map(f, [1, 2, 3, 4]))
print(type(map(f, [1, 2, 3, 4])))
for i in map(f, [1, 2, 3, 4]):
    print(i)
<map object at 0x00000000061ACCF8>
<class 'map'>
1
4
9
16
def testMap(fun,iter):# 可以自行写高阶函数
    l = list()
    for i in iter:
        l.append(i)
    return l
print(testMap(f,[1,2,3,4]))
[1, 2, 3, 4]
#filter(lambda x: x%2 ==1, [1, 2, 3, 4, 5])
print(filter(lambda x: x%2 ==1, [1, 2, 3, 4, 5]))
for i in filter(lambda x: x%2 ==1, [1, 2, 3, 4, 5]):
    print(i)
<filter object at 0x000000000619D668>
1
3
5
from functools import reduce
def add(x,y):
    return x+y
reduce(add, [1, 2, 3, 4, 5])# 累计迭代
15
#唯一用的多的高阶函数是sorted函数
#sorted(iterable, key, reverse)
#iterable 一个可迭代的对象
#key 对什么进行排序
#reverse bool类型,如果为true为反序,默认为false
# 返回值是一个list
# sorted(iterable, cmp=None, key=None, reverse=False) --> new sorted list
print(sorted([1,4,342,3,45,76,435,34]))
print(sorted([1,4,342,3,45,76,435,34],reverse=True))
[1, 3, 4, 34, 45, 76, 342, 435]
[435, 342, 76, 45, 34, 4, 3, 1]
# 对字典进行排序:
# 按照value进行排序
mm = dict(a=1,c=10,b=3,d=9)
print(mm)
#print sorted(mm.iteritems(), key = lambda d:d[1], reverse = True) 
print(sorted(mm.items())) #这里只有k的排序,也是默认状态
print(sorted(mm.items(), key = lambda d:d[1], reverse = True)) #这里就是基于对应值的排序
#key = lambda d:d[1]这里的匿名函数就是取出,d的,第二个值
for i in mm:
    print(i)# 输出key的值没有对应的值,所以做不到对字典的排序
for i in mm.items():
    print(i)
#三种初始化字典的方法
d1=dict(a=1,b=2)
d2={"a":1,"b":2}
d3=dict([("a",1),("b",2)])
print(d1,d2,d3)
print("#####")
print(dict(sorted(mm.items()))) 
{'a': 1, 'c': 10, 'b': 3, 'd': 9}
[('a', 1), ('b', 3), ('c', 10), ('d', 9)]
[('c', 10), ('d', 9), ('b', 3), ('a', 1)]
a
c
b
d
('a', 1)
('c', 10)
('b', 3)
('d', 9)
{'a': 1, 'b': 2} {'a': 1, 'b': 2} {'a': 1, 'b': 2}
#####
{'a': 1, 'b': 3, 'c': 10, 'd': 9}

生成式和生成器

# 列表生成式格式:
#[exp for val in collection if condition]
#[x*x for x in xrange(10) if x*x%2 == 0]
def jgg():
    number = list()
    for i in range(1,5):
        number.append(i)
        for A in [x for x in range(1,5)]:
            for B in [x for x in range(1,5) if x!=A]:
                for C in [x for x in range(1,5) if x!=A and x!=B]:
                    for D in [x for x in range(1,5) if x!=A and x!=B and x!=C]:
                        print("A = {0} B = {1} C = {2} D = {3}".format(A,B,C,D))
jgg()
A = 1 B = 2 C = 3 D = 4
A = 1 B = 2 C = 4 D = 3
A = 1 B = 3 C = 2 D = 4
A = 1 B = 3 C = 4 D = 2
A = 1 B = 4 C = 2 D = 3
A = 1 B = 4 C = 3 D = 2
A = 2 B = 1 C = 3 D = 4
A = 2 B = 1 C = 4 D = 3
A = 2 B = 3 C = 1 D = 4
A = 2 B = 3 C = 4 D = 1
A = 2 B = 4 C = 1 D = 3
A = 2 B = 4 C = 3 D = 1
A = 3 B = 1 C = 2 D = 4
...
# 生成器(generator):
# 方法一:区别生成式是,左右括号从方括号变成了圆括号
# (exp for val in collection if condition)
a1 = (x for x in range(1,10) if x%2==0)
print(a1)
print("#"*10)
print(next(a1))
#python2 用a1.next()
print("##"*10)
for i in a1:#被next之后,元素被取出,这里就少一个
    print(i)
a2 = [x for x in range(1,10) if x%2==0]
print(a2)

<generator object <genexpr> at 0x00000000061AD6D0>
##########
2
####################
4
6
8
[2, 4, 6, 8]

# 生成器(generator):
# 方法二:
#使用yield关键字,包含yield语句的函数会被特地编译成生成器。

##列表生成式直接返回了表达式的结果列表, 而生成器是一个对象,该对象包含了对表达式结果的计算引用, 通过循环可以直接输出
#生成器不会一次性列出所有的数据,当你用到的时候,在列出来,更加节约内存的使用率。
#类似range(1, 0)     xrange(1, 10)的区别,  但是类型去不同
def test1():
    a = 1
    for i in range(1,10):
        return i
    #
    print(i)
def test2():
    a = 1
    for i in range(1,10):
        yield i
        #
        a+=1
        print(i)
        #yield可以理解成return,但是并不退出,只是挂起,恢复的时候从yield下面一行开始执行。
m = test1()
mm = test2()
print(m)
print(mm)


1
<generator object test2 at 0x0000000005A3B200>
<generator object test2 at 0x0000000005A3B200>


#题目5?:
#/etc/passwd 对这个文件进行uid排序
import codecs
def px(item):
    pass
result = ""
with codecs.open("Untitled1.txt","r")as f:
    #sorted(iterable=f.readlines(),key=lambda item: item.split(":")[2])
    sorted(f.readlines(),key=lambda item: int(item.split(":")[2]))
with codecs.open("sortPasswd","w") as f:
    f.writelines(result)

















  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值