zoukankan      html  css  js  c++  java
  • python切片、迭代、生成器、列表生成式等高级特性学习

    python高级特性

    1行代码能实现的功能,决不写5行代码。请始终牢记,代码越少,开发效率越高。

    • 切片
      当我们要取一个list中的前n各元素时,如果前n个少的话,我们还可以一个一个的取,但是若前n个元素极其多的话,我们就要采取其他办法:

        L = [];
        n = 1;
        while n <= 99:
        	L.append(n);
        	n = n + 2;
            
        print(L);
        
        #取前三个元素
        r = [];
        a = 3;
        for i in range(a):
        	r.append(L[i]);
        
        print(r);
      

    对这种经常指定索引范围的操作,用循环会十分繁琐,所以python提供了切片(slice)操作符,取前三个元素一行代码就可以完成:

    	#一行代码完成取前三个元素
    	print(L[0:3]);
    

    表示从0开始取,直到3结束,不包括索引3。类似的。L[-1],就指倒数第一个元素

    • 迭代
      如果给定一个list或tuple,我们可以通过for循环来遍历这个list或tuple,这种遍历我们称为迭代。

        #迭代dict(相当于map)
        d = {"a": 1, "b": 2, "c": 3};
        for key in d:
        	print(key);
        	#a b c
        #迭代value
        for value in d.values():
        	print(value);
        	#1 2 3
      

    注意:如果要对list实现类似于Java那样的下标循环,我们可以使用python内置的enumerate函数实现索引-元素对。

    	#用enumerate函数实现list变成索引-元素对
    	for i, value in enumerate(["a", "b", "c"]):
    		print(i, value);
    		# 0 a
    		# 1 b
    		# 2 c;
    
    • 列表生成式
      即list comprehensions,是用来创建list的生成式,生成1~10d的list可以用list(range[1, 11])

        #用列表生成式创建list
        print(list(range(1, 11)));
      

    生成[11,22, 33, ... ,1010]

    	L1 = [];
    	for x in range(1, 11):
    		L1.append(x*x);
    	print(L1);
    	#[1, 4, 9, 16, 25, 36, 49, 64, 81, 100]
    	#使用列表生成式
    	print([x*x for x in range(1, 11)]);
    

    for循环后面还可以加上if判断语句:

    	L2 = [x * x for x in range(1, 11) if x % 2 == 0];
    	print(L2);#[4, 16, 36, 64, 100]
    

    等等这样的生成操作,可以根据自己的情况来进行生成。

    • 生成器
      是一种一边循环一遍计算的机制(也是一个函数):generator (我没记错的话,es6中也有这个生成器,但是功能还有有区别)
      创建一个generator,方式:
    1. 将列表生成器的[ ]改成( ),就创建了一个generator:

       	#用()创建一个generator
       	L3 = (x*x for x in range(10))
       	print(L3);
           #<generator object <genexpr> at 0x00000276D57E8A40>
      

    可以通过next()来一个个打印generator的返回值,也可以用循环:

    		L3 = (x*x for x in range(10));
    		for i in L3:
    			print(i);
    
    1. 带yield的generator function
      斐波拉契数列打印:

       	#普通函数编写的费比拉数列
       	def fib(max):
       		n, a, b = 0, 0, 1;
       		while n < max:
       			print(b);
       			a, b = b, a + b;
       			n = n + 1;
       		return 'done';
       	print(fib(6));
       	# 1
       	# 1
       	# 2
       	# 3
       	# 5
       	# 8
       	# done
       	#用generator函数只需要把print(b)变成yield b即可
       	
       	def fib1(max):
       	    n, a, b = 0, 0, 1
       	    while n < max:
       	        yield b
       	        a, b = b, a + b
       	        n = n + 1
       	    return 'done'
       	print(fib1(6));
       	#<generator object fib at 0x104feaaa0>
      

    generator的函数,在每次调用next()的时候执行,遇到yield语句返回,再次执行时从上次返回的yield语句处继续执行。在执行过程中,遇到yield就中断,下次又继续执行
    3. 杨辉三角

    		#杨辉三角
    		def triangles():
    		       N = [1]
    		       while True:
    		           yield N
    		           N.append(0)
    		           N = [N[i]+N[i-1] for i in range(len(N))]
    		
    		n1 = 0
    		results = []
    		for t in triangles():
    		    print(t)
    		    results.append(t)
    		    n1 = n1 + 1
    		    if n1 == 10:
    		        break
    
    1. 总结
      generator是非常强大的工具,在Python中,可以简单地把列表生成式改成generator,也可以通过函数实现复杂逻辑的generator。
      要理解generator的工作原理,它是在for循环的过程中不断计算出下一个元素,并在适当的条件结束for循环。对于函数改成的generator来说,遇到return语句或者执行到函数体最后一行语句,就是结束generator的指令,for循环随之结束。
      区分普通函数和generator函数,普通函数调用直接返回结果,generator函数的“调用”实际返回一个generator对象
    • 迭代器
      可以被next()函数调用并不断返回下一个值的对象称为迭代器:Iterator(很像es6的Iterator接口)
      凡是可作用于for循环的对象都是Iterable类型;
      凡是可作用于next()函数的对象都是Iterator类型,它们表示一个惰性计算的序列;
      集合数据类型如list、dict、str等是Iterable但不是Iterator,不过可以通过iter()函数获得一个Iterator对象。

    • 总结
      以上都是python非常强大的特性,他们灵活的运用在python处理list、tuple等数据组上,自己学习的很浅,还是需要进行不断地练习及接触更多的关于python的demo。

  • 相关阅读:
    HttpServletResponse对锂
    搭建java Web项目开发环境(一)
    React Native动画-Animated
    React-Navigation redux集成
    react-navigation 使用详解
    echart
    io-输出流
    react-native-lesson
    集合类-HashSet去重
    kafka不同主题使用同一个group.id的坑
  • 原文地址:https://www.cnblogs.com/yehui-mmd/p/7866558.html
Copyright © 2011-2022 走看看