python的一些高级特性

版权声明:欢迎分享,但请注明出处,谢谢 https://blog.csdn.net/qq_28057577/article/details/78783558
目录:
    1.slice切片
    2.迭代
    3.列表生成式
    4.生成器(generator)
    5.迭代器(Iterator)

1.slice切片
    python slice切片是一个 无需通过下标即可 简单快速获取list、tuple或str中部分元素的方法。下面我们通过简单的案例去学习它的使用。
    
    
  1. '''
  2. list遍历
  3. '''
  4. list_name=["andy","alice","elic","wendy","jack","cendy","lily","pony","robot"]
  5. length=len(list_name)
  6. #list下标以0开始,结束位置元素不被包括
  7. #print(list_name[开始位置:结束位置:步长])
  8. #遍历输出list前三项的list
  9. print('list_name[0:3] =',list_name[0:3])
  10. #从尾部遍历,相当于list取反
  11. print('list_name[::-1] =',list_name[::-1])
  12. print('list_name[-1::-1] =',list_name[-1::-1])
  13. #步长为2,遍历输出list
  14. print('list_name[::2] =',list_name[::2])
  15. #类是与copy
  16. print('list_name[::] =',list_name[::])
  17. print('list_name[0:length+1] =',list_name[0:length+1])
  18. #从最后倒序获取到-5
  19. print('list_name[-1:-5:-1] =',list_name[-1:-5:-1])
  20. #从第下标为4的地方开始获取
  21. print('list_name[4:] =',list_name[4:])
  22. #获取最后一位
  23. print('list_name[-1:] =',list_name[-1:])
  24. '''
  25. tuple遍历
  26. '''
  27. print("-------------------------------------")
  28. #tuple中slice的使用一致
  29. tuple_name=("andy","alice","elic","wendy","jack","cendy","lily","pony","robot")
  30. print('list_name[4:] =',list_name[4:])
  31. print('tuple_name[-1:] =',tuple_name[-1:])
  32. '''
  33. str遍历
  34. '''
  35. print("-------------------------------------")
  36. #str中slice的使用也一致
  37. string="hello my name is andy!"
  38. print(string[::])
  39. print(string[5:])
  40. print(string[::-1])
  41. # 去除空格
  42. trim_str=""
  43. i=0
  44. while i<len(string)+1:
  45. if string[i:i+1] ==' ':
  46. pass
  47. else:
  48. trim_str=trim_str+string[i:i+1]
  49. i=i+1
  50. print("trim_str=",trim_str)
 输出结果:
    
    
  1. D:\python3\python.exe D:/pycharm/workspace/demo/py6.py
  2. list_name[0:3] = ['andy', 'alice', 'elic']
  3. list_name[::-1] = ['robot', 'pony', 'lily', 'cendy', 'jack', 'wendy', 'elic', 'alice', 'andy']
  4. list_name[-1::-1] = ['robot', 'pony', 'lily', 'cendy', 'jack', 'wendy', 'elic', 'alice', 'andy']
  5. list_name[::2] = ['andy', 'elic', 'jack', 'lily', 'robot']
  6. list_name[::] = ['andy', 'alice', 'elic', 'wendy', 'jack', 'cendy', 'lily', 'pony', 'robot']
  7. list_name[0:length+1] = ['andy', 'alice', 'elic', 'wendy', 'jack', 'cendy', 'lily', 'pony', 'robot']
  8. list_name[-1:-5:-1] = ['robot', 'pony', 'lily', 'cendy']
  9. list_name[4:] = ['jack', 'cendy', 'lily', 'pony', 'robot']
  10. list_name[-1:] = ['robot']
  11. -------------------------------------
  12. list_name[4:] = ['jack', 'cendy', 'lily', 'pony', 'robot']
  13. tuple_name[-1:] = ('robot',)
  14. -------------------------------------
  15. hello my name is andy!
  16. my name is andy!
  17. !ydna si eman ym olleh
  18. trim_str= hellomynameisandy!
  19. Process finished with exit code 0
    里面有一些非常巧的使用方法,请细心查看并去实践哦。

2.迭代
    迭代也就是我们说的循环,python中的迭代由 for ...in...来完成,当然还有 while、  enumerate我们先不讲,那么要迭代我们首先要明白你想迭代的东西是否可以迭代,也就是判断该对象是否为Iterable类型,我们来看看简单的判断函数使用:
    
    
  1. from collections import Iterable
  2. #isinstance([1,2,3,4],Iterable)判断一个对象是否是可迭代的
  3. print("list is Iterable:",isinstance([1,2,3,4],Iterable))
  4. print("tuple is Iterable:",isinstance((1,2,3,4),Iterable))
  5. print("str is Iterable:",isinstance("dsfff",Iterable))
  6. print("int is Iterable:",isinstance(123,Iterable))
  7. print("dict is Iterable:",isinstance({"andy":24,"cendy":22},Iterable))
  8. print("set is Iterable:",isinstance(set([1,3,24,5]),Iterable))
输出结果:
    
    
  1. D:\python3\python.exe D:/pycharm/workspace/demo/py7.py
  2. list is Iterable: True
  3. tuple is Iterable: True
  4. str is Iterable: True
  5. int is Iterable: False
  6. dict is Iterable: True
  7. set is Iterable: True
  8. Process finished with exit code 0
上面结果表明list ,tuple,str,dict,set都是Iterable类型的。接下来我们分别实践一下他们的迭代。
    
    
  1. '''
  2. list迭代
  3. '''
  4. for l in list(range(1,4)):
  5. print(l)
  6. print("------------------------")
  7. '''
  8. tuple迭代
  9. '''
  10. for t in ("ssd",34,"andy"):
  11. print(t)
  12. print("------------------------")
  13. '''
  14. str迭代
  15. '''
  16. for s in "andy":
  17. print(s)
  18. print("------------------------")
  19. '''
  20. dict迭代
  21. '''
  22. print("------keys-------")
  23. dict_n={"andy":22,"lily":24,"wendy":25}
  24. #迭代key
  25. for key in dict_n.keys():
  26. print(key)
  27. #默认迭代key
  28. for d in dict_n:
  29. print(d)
  30. print("------items-------")
  31. #迭代key和value
  32. for key,value in dict_n.items():
  33. print(key,value)
  34. print("------values-------")
  35. #迭代key和value
  36. for value in dict_n.values():
  37. print(value)
  38. print("------------------------")
  39. set_n=set(["andy","lily","wendy","jack"])
  40. for i in set_n:
  41. print(i)
结果就不贴出了,都比较简单,主要注意一下的就是 dict的迭代,他可以只迭代key和只迭代value,还可以key和value两个同时迭代。
   
我们来看一下一些特殊的迭代, list内嵌tuple实现多变量迭代 和 enumerate()函数实现下标和value的迭代输出 
    
    
  1. print("------------------------")
  2. for x,y in [(1,1),(2,2),(3,3),(4,4),(5,5)]:
  3. print(x,y)
  4. print("------------enumerate tuple------------")
  5. for i,v in enumerate(("andy","emy","wendy")):
  6. print(i,v)
  7. print("------------enumerate list------------")
  8. for i,v in enumerate(["andy","emy","wendy"]):
  9. print(i,v)
  10. print("------------enumerate set------------")
  11. for i,v in enumerate(set(["andy","emy","wendy"])):
  12. print(i,v)
  13. print("------------enumerate str------------")
  14. for i,v in enumerate("andy"):
  15. print(i,v)
  16. print("------------enumerate dict------------")
  17. #迭代到下标个key值
  18. for i, k in enumerate({"andy":23,"sandy":44,"cindy":10}):
  19. print(i, k)
结果输出:
     
     
  1. ------------------------
  2. 1 1
  3. 2 2
  4. 3 3
  5. 4 4
  6. 5 5
  7. ------------enumerate tuple------------
  8. 0 andy
  9. 1 emy
  10. 2 wendy
  11. ------------enumerate list------------
  12. 0 andy
  13. 1 emy
  14. 2 wendy
  15. ------------enumerate set------------
  16. 0 andy
  17. 1 emy
  18. 2 wendy
  19. ------------enumerate str------------
  20. 0 a
  21. 1 n
  22. 2 d
  23. 3 y
  24. ------------enumerate dict------------
  25. 0 andy
  26. 1 sandy
  27. 2 cindy
  28. Process finished with exit code 0
ok,统统写一边去验证一下就都明白了,迭代我们就学习这么多。

  3.列表生成式
        所谓列表生成式就是通过一个特殊的表达式可以快速的生成我们想要的list,而无需我们手动构造或者循环构造。
    之前我们用过一个简单生成list的方式list(range(1,21)),省去了傻瓜式构造麻烦,但是这样只能生成[1,2,3,...,20]这样简单的list,不能生成复杂的list,比如:[1,4,9,26,25,36,49,...,400].当然我们可以通过for循环去迭代生成,但是并不简洁,这个时候“列表生成式”就派上用场了,我们来看看列表生成式到底长什么样。
    
    
  1. #生成顺阶数的平方list
  2. sq_list=[x*x for x in range(1,21)]
  3. #生成顺阶数的立方list
  4. sq1_list=[x*x*x for x in range(1,21)]
  5. print("x平方list=",sq_list)
  6. print("x立方list=",sq1_list)
  7. #列表生成式加上if语句
  8. #顺阶数的平方奇数list
  9. j_list=[x*x for x in range(1,21) if x%2!=0]
  10. print("x平方奇数list=",j_list)
  11. #循环嵌套,数字组合生成全排列
  12. for_list=[x+y for x in '123' for y in '456']
  13. print(for_list)
  14. for_list=[x+y for y in '123' for x in '456']
  15. print(for_list)
输出结果:
    
    
  1. D:\python3\python.exe D:/pycharm/workspace/demo/py8.py
  2. x平方list= [1, 4, 9, 16, 25, 36, 49, 64, 81, 100, 121, 144, 169, 196, 225, 256, 289, 324, 361, 400]
  3. x立方list= [1, 8, 27, 64, 125, 216, 343, 512, 729, 1000, 1331, 1728, 2197, 2744, 3375, 4096, 4913, 5832, 6859, 8000]
  4. x平方奇数list= [1, 9, 25, 49, 81, 121, 169, 225, 289, 361]
  5. ['14', '15', '16', '24', '25', '26', '34', '35', '36']
  6. ['41', '51', '61', '42', '52', '62', '43', '53', '63']
  7. Process finished with exit code 0
上面列表生成器的简单实例,已经告诉我们他还可以实现与if和for嵌套连用,是不是很神奇?

4.生成器(generator)
    生成器是一种一边循环一遍推算下一个值的机制,与list生成不同的是,list一开始就在内存中保存了所有的元素,这样非常浪费空间。同时generator也是iterator的一种,而list则是iterable,如果要转换成 iterator还需要iter()函数,这些我们将在下一节中学习。

4.1)生成器的创建
        生成器的创建方式有两种,一种为 列表生成式生成 ,另外一种则是函数+yield关键字生成。
   (1)列表生成式生成与输出
    
    
  1. #将列表生成式的[]换成()即可创建生成器(generator)
  2. print([x*x for x in range(1,11)])
  3. print(x*x for x in range(1,11))
  4. g=(x*x for x in range(1,11))
  5. print(g)
  6. print((x*x for x in range(1,11)))
  7. print("---------------------")
  8. #next()每调用一次输出一个数据
  9. g=(x*x for x in range(1,11))
  10. print(next(g))
  11. print(next(g))
  12. print(next(g))
  13. print("---------------------")
  14. #for循环输出
  15. g=(x*x for x in range(1,11))
  16. for i in g:
  17. print(i)
输出结果:
    
    
  1. D:\python3\python.exe D:/pycharm/workspace/demo/py8.py
  2. [1, 4, 9, 16, 25, 36, 49, 64, 81, 100]
  3. <generator object <genexpr> at 0x0000000002150F68>
  4. <generator object <genexpr> at 0x0000000002150F68>
  5. <generator object <genexpr> at 0x0000000002150FC0>
  6. ---------------------
  7. 1
  8. 4
  9. 9
  10. ---------------------
  11. 1
  12. 4
  13. 9
  14. 16
  15. 25
  16. 36
  17. 49
  18. 64
  19. 81
  20. 100
  21. Process finished with exit code 0
    上面验证了生成器一边迭代一边计算下一个值的特性,每当我们调用next(g)一次他就会对应生成下一个值并返回
    
4.2)函数+yield关键字生成
            函数的调用我们都应该很清楚,顺序执行return返回,但是带了yield关键字后的函数该怎么执行呢?yield关键字的函数也就是我们的generator在调用的时候是遇到yield关键字返回,然后再次调用的时候会紧接着上次返回的地方执行。
        
       上面 列表生成式创建generator的 示例中讲到我们可以通过 next() for循环 调用输出值,其实我们还有一种方式就是用 send() 的方式调用,那 send() 调用与 next() 调用不同的是 send() 可以实现与保存的算法进行传值这些简单的交互,从而改变原本应该输出的值,但是他不是在任何时候都能使用。接下来我们通过  函数+yield关键字创建 generator  同时一起来 看看send()的用法:
    
    
  1. def mGenerator(value=1):
  2. while 1:
  3. value=yield value
  4. print("value=",value)
  5. if value:
  6. value+=1
  7. g=mGenerator()
  8. print("---------g.send(None)-----------")
  9. print(g.send(None))
  10. print("---------next(g)-----------")
  11. print(next(g))
  12. print("---------next(g)-----------")
  13. print(next(g))
  14. print("---------g.send(5)-----------")
  15. print(g.send(5))
输出结果:
    
    
  1. D:\python3\python.exe D:/pycharm/workspace/demo/py8.py
  2. ---------g.send(None)-----------
  3. 1
  4. ---------next(g)-----------
  5. value= None
  6. None
  7. ---------next(g)-----------
  8. value= None
  9. None
  10. ---------g.send(5)-----------
  11. value= 5
  12. 6
  13. Process finished with exit code 0
    我们来分析一下结果,首先我们实例化一个函数对象g然后呢通过 g.send(None)也就是前面说的send()传值的用法,这个时候mGenerator函数本身有个默认值为1,传递None则使用默认值,进入函数后碰到 yield value以后呢他会首先返回value也就是我们看到的1,然后呢将None赋值给了value, 第二次调用next(g)的时候执行下面的 print("value=",value)这时候就会把赋值为None的Value打印出来,因为是None所以不会有+1的操作,所以会连续两次都输出None,直到后面调用 send(5)的时候重新传入了一个参数值将之前的value=None的魔咒打破,这时候就会出现输出 value=5然后输出6的情况了。

我们再来看一个使用send()方法姿势不对的情况:
    
    
  1. def mGenerator(value=1):
  2. while 1:
  3. value=yield value
  4. print("value=",value)
  5. if value:
  6. value+=1
  7. g=mGenerator()
  8. print("---------g.send(1)-----------")
  9. print(g.send(1))
输出结果:
    
    
  1. D:\python3\python.exe D:/pycharm/workspace/demo/py8.py
  2. Traceback (most recent call last):
  3. ---------g.send(None)-----------
  4. File "D:/pycharm/workspace/demo/py8.py", line 54, in <module>
  5. print(g.send(1))
  6. TypeError: can't send non-None value to a just-started generator
  7. Process finished with exit code 1
假比我一上来就给他调用一个 g.send(1)他就报错了,错误显示  我们不能在生成器调用一开始就传入非None的值,也就是说一开始你可以像之前那样调用 g.send(None)或者一开始先调用 next(g),但不能调用g.send()传递非None值,具体为什么我们就没必要去深究了,只要记住就好。

5.迭代器(Iterator)
    迭代器即是可用于next()函数迭代的一个惰性序列对象。 生成器(generator)算一类,而 list、tuple、set、dict、str可以通过 iter()函数转换为Iterator对象,上面我们简单提了一下Iterable generator和Iterator三者的关系,但是没有所得很明白,接下来各大家一张描述图,图片来自: http://kissg.me/2016/04/09/python-generator-yield/ 感兴趣的朋友可以看看博主的文章,写的很不错。


接下来我们通过一段代码来验证一下上面说的
 
     
     
  1. from collections import Iterable,Iterator
  2. list_l=[12,34,56,67,33]
  3. tuple_t=(1,2,3)
  4. dict_d={"andy":23,"alice":18}
  5. set_s=set(list_l)
  6. str_s="my name is andy!"
  7. g=(x*x for x in range(1,11))
  8. print("list is Iterable:",isinstance(list_l,Iterable))
  9. print("list is Iterator:",isinstance(list_l,Iterator))
  10. print("iter(list) is Iterator:",isinstance(iter(list_l),Iterator))
  11. print("--------------------------------------------")
  12. print("tuple is Iterable:",isinstance(tuple_t,Iterable))
  13. print("tuple is Iterator:",isinstance(tuple_t,Iterator))
  14. print("iter(tuple) is Iterator:",isinstance(iter(tuple_t),Iterator))
  15. print("--------------------------------------------")
  16. print("dict is Iterable:",isinstance(dict_d,Iterable))
  17. print("dict is Iterator:",isinstance(dict_d,Iterator))
  18. print("iter(dict) is Iterator:",isinstance(iter(dict_d),Iterator))
  19. print("--------------------------------------------")
  20. print("set is Iterable:",isinstance(set,Iterable))
  21. print("set is Iterator:",isinstance(set_s,Iterator))
  22. print("iter(set) is Iterator:",isinstance(iter(set_s),Iterator))
  23. print("--------------------------------------------")
  24. print("str is Iterable:",isinstance(str_s,Iterable))
  25. print("str is Iterator:",isinstance(str_s,Iterator))
  26. print("iter(str) is Iterator:",isinstance(iter(str_s),Iterator))
  27. print("--------------------------------------------")
  28. print("generator is Iterable:",isinstance(g,Iterable))
  29. print("generator is Iterator:",isinstance(g,Iterator))
输出结果如下:
    
    
  1. D:\python3\python.exe D:/pycharm/workspace/demo/py9.py
  2. list is Iterable: True
  3. list is Iterator: False
  4. iter(list) is Iterator: True
  5. --------------------------------------------
  6. tuple is Iterable: True
  7. tuple is Iterator: False
  8. iter(tuple) is Iterator: True
  9. --------------------------------------------
  10. dict is Iterable: True
  11. dict is Iterator: False
  12. iter(dict) is Iterator: True
  13. --------------------------------------------
  14. set is Iterable: False
  15. set is Iterator: False
  16. iter(set) is Iterator: True
  17. --------------------------------------------
  18. str is Iterable: True
  19. str is Iterator: False
  20. iter(str) is Iterator: True
  21. --------------------------------------------
  22. generator is Iterable: True
  23. generator is Iterator: True
  24. Process finished with exit code 0
    
    ok,python的一些高级特性就简单学习这么多。
    
    参考文章:
                

猜你喜欢

转载自blog.csdn.net/qq_28057577/article/details/78783558
今日推荐