您的位置:首页 > 编程语言 > Python开发

python的一些高级特性

2017-12-12 16:50 519 查看

目录:


1.slice切片

2.迭代

3.列表生成式

4.生成器(generator)

5.迭代器(Iterator)


1.slice切片


python slice切片是一个无需通过下标即可简单快速获取list、tuple或str中部分元素的方法。下面我们通过简单的案例去学习它的使用。

'''

list遍历

'''

list_name=["andy","alice","elic","wendy","jack","cendy","lily","pony","robot"]


length=len(list_name)

#list下标以0开始,结束位置元素不被包括

#print(list_name[开始位置:结束位置:步长])


#遍历输出list前三项的list

print('list_name[0:3] =',list_name[0:3])


#从尾部遍历,相当于list取反

print('list_name[::-1] =',list_name[::-1])

print('list_name[-1::-1] =',list_name[-1::-1])

#步长为2,遍历输出list

print('list_name[::2] =',list_name[::2])


#类是与copy

print('list_name[::] =',list_name[::])

print('list_name[0:length+1] =',list_name[0:length+1])


#从最后倒序获取到-5

print('list_name[-1:-5:-1] =',list_name[-1:-5:-1])


#从第下标为4的地方开始获取

print('list_name[4:] =',list_name[4:])


#获取最后一位

print('list_name[-1:] =',list_name[-1:])


'''

tuple遍历

'''

print("-------------------------------------")

#tuple中slice的使用一致

tuple_name=("andy","alice","elic","wendy","jack","cendy","lily","pony","robot")

print('list_name[4:] =',list_name[4:])

print('tuple_name[-1:] =',tuple_name[-1:])


'''

str遍历

'''

print("-------------------------------------")

#str中slice的使用也一致

string="hellomy name is andy!"

print(string[::])

print(string[5:])

print(string[::-1])


# 去除空格

trim_str=""

i=0

while i<len(string)+1:

if string[i:i+1] ==' ':

pass

else:

trim_str=trim_str+string[i:i+1]

i=i+1

print("trim_str=",trim_str)

[/code]

输出结果:

D:\python3\python.exe D:/pycharm/workspace/demo/py6.py

list_name[0:3] = ['andy', 'alice', 'elic']

list_name[::-1] = ['robot', 'pony', 'lily', 'cendy', 'jack', 'wendy', 'elic', 'alice', 'andy']

list_name[-1::-1] = ['robot', 'pony', 'lily', 'cendy', 'jack', 'wendy', 'elic', 'alice', 'andy']

list_name[::2] = ['andy', 'elic', 'jack', 'lily', 'robot']

list_name[::] = ['andy', 'alice', 'elic', 'wendy', 'jack', 'cendy', 'lily', 'pony', 'robot']

list_name[0:length+1] = ['andy', 'alice', 'elic', 'wendy', 'jack', 'cendy', 'lily', 'pony', 'robot']

list_name[-1:-5:-1] = ['robot', 'pony', 'lily', 'cendy']

list_name[4:] = ['jack', 'cendy', 'lily', 'pony', 'robot']

list_name[-1:] = ['robot']

-------------------------------------

list_name[4:] = ['jack', 'cendy', 'lily', 'pony', 'robot']

tuple_name[-1:] = ('robot',)

-------------------------------------

hellomy name is andy!

my name is andy!

!ydna si eman ym olleh

trim_str= hellomynameisandy!


Process finished with exit code 0

[/code]

里面有一些非常巧的使用方法,请细心查看并去实践哦。


2.迭代


迭代也就是我们说的循环,python中的迭代由for ...in...来完成,当然还有while、 enumerate我们先不讲,那么要迭代我们首先要明白你想迭代的东西是否可以迭代,也就是判断该对象是否为Iterable类型,我们来看看简单的判断函数使用:

from collections import Iterable

#isinstance([1,2,3,4],Iterable)判断一个对象是否是可迭代的

print("list is Iterable:",isinstance([1,2,3,4],Iterable))

print("tuple is Iterable:",isinstance((1,2,3,4),Iterable))

print("str is Iterable:",isinstance("dsfff",Iterable))

print("int is Iterable:",isinstance(123,Iterable))

print("dict is Iterable:",isinstance({"andy":24,"cendy":22},Iterable))

print("set is Iterable:",isinstance(set([1,3,24,5]),Iterable))

[/code]

输出结果:

D:\python3\python.exe D:/pycharm/workspace/demo/py7.py

list is Iterable: True

tuple is Iterable: True

str is Iterable: True

int is Iterable: False

dict is Iterable: True

set is Iterable: True


Process finished with exit code 0

[/code]

上面结果表明list ,tuple,str,dict,set都是Iterable类型的。接下来我们分别实践一下他们的迭代。

'''

list迭代

'''

for l in list(range(1,4)):

print(l)

print("------------------------")

'''

tuple迭代

'''

for t in ("ssd",34,"andy"):

print(t)

print("------------------------")

'''

str迭代

'''

for s in "andy":

print(s)

print("------------------------")

'''

dict迭代

'''

print("------keys-------")

dict_n={"andy":22,"lily":24,"wendy":25}

#迭代key

for key in dict_n.keys():

print(key)

#默认迭代key

for d in dict_n:

print(d)


print("------items-------")

#迭代key和value

for key,value in dict_n.items():

print(key,value)


print("------values-------")

#迭代key和value

for value in dict_n.values():

print(value)

print("------------------------")

set_n=set(["andy","lily","wendy","jack"])

for i in set_n:

print(i)

[/code]

结果就不贴出了,都比较简单,主要注意一下的就是 dict的迭代,他可以只迭代key和只迭代value,还可以key和value两个同时迭代。

我们来看一下一些特殊的迭代,list内嵌tuple实现多变量迭代 和enumerate()函数实现下标和value的迭代输出

print("------------------------")

for x,y in [(1,1),(2,2),(3,3),(4,4),(5,5)]:

print(x,y)

print("------------enumerate tuple------------")

for i,v in enumerate(("andy","emy","wendy")):

print(i,v)

print("------------enumerate list------------")

for i,v in enumerate(["andy","emy","wendy"]):

print(i,v)

print("------------enumerate set------------")

for i,v in enumerate(set(["andy","emy","wendy"])):

print(i,v)

print("------------enumerate str------------")

for i,v in enumerate("andy"):

print(i,v)

print("------------enumerate dict------------")

#迭代到下标个key值

for i, k in enumerate({"andy":23,"sandy":44,"cindy":10}):

print(i, k)

[/code]

结果输出:

------------------------

1 1

2 2

3 3

4 4

5 5

------------enumerate tuple------------

0 andy

1 emy

2 wendy

------------enumerate list------------

0 andy

1 emy

2 wendy

------------enumerate set------------

0 andy

1 emy

2 wendy

------------enumerate str------------

0 a

1 n

2 d

3 y

------------enumerate dict------------

0 andy

1 sandy

2 cindy


Process finished with exit code 0

[/code]

ok,统统写一边去验证一下就都明白了,迭代我们就学习这么多。

3.列表生成式

所谓列表生成式就是通过一个特殊的表达式可以快速的生成我们想要的list,而无需我们手动构造或者循环构造。

之前我们用过一个简单生成list的方式list(range(1,21)),省去了傻瓜式构造麻烦,但是这样只能生成[1,2,3,...,20]这样简单的list,不能生成复杂的list,比如:[1,4,9,26,25,36,49,...,400].当然我们可以通过for循环去迭代生成,但是并不简洁,这个时候“列表生成式”就派上用场了,我们来看看列表生成式到底长什么样。

#生成顺阶数的平方list

sq_list=[x*x for x in range(1,21)]

#生成顺阶数的立方list

sq1_list=[x*x*x for x in range(1,21)]

print("x平方list=",sq_list)

print("x立方list=",sq1_list)


#列表生成式加上if语句

#顺阶数的平方奇数list

j_list=[x*x for x in range(1,21) if x%2!=0]

print("x平方奇数list=",j_list)


#循环嵌套,数字组合生成全排列

for_list=[x+y for x in '123' for y in '456']

print(for_list)

for_list=[x+y for y in '123' for x in '456']

print(for_list)

[/code]

输出结果:

D:\python3\python.exe D:/pycharm/workspace/demo/py8.py

x平方list= [1, 4, 9, 16, 25, 36, 49, 64, 81, 100, 121, 144, 169, 196, 225, 256, 289, 324, 361, 400]

x立方list= [1, 8, 27, 64, 125, 216, 343, 512, 729, 1000, 1331, 1728, 2197, 2744, 3375, 4096, 4913, 5832, 6859, 8000]

x平方奇数list= [1, 9, 25, 49, 81, 121, 169, 225, 289, 361]

['14', '15', '16', '24', '25', '26', '34', '35', '36']

['41', '51', '61', '42', '52', '62', '43', '53', '63']


Process finished with exit code 0

[/code]

上面列表生成器的简单实例,已经告诉我们他还可以实现与if和for嵌套连用,是不是很神奇?


4.生成器(generator)


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


4.1)生成器的创建


生成器的创建方式有两种,一种为列表生成式生成,另外一种则是函数+yield关键字生成。

(1)列表生成式生成与输出

#将列表生成式的[]换成()即可创建生成器(generator)

print([x*x for x in range(1,11)])

print(x*x for x in range(1,11))


g=(x*x for x in range(1,11))

print(g)


print((x*x for x in range(1,11)))


print("---------------------")


#next()每调用一次输出一个数据

g=(x*x for x in range(1,11))

print(next(g))

print(next(g))

print(next(g))


print("---------------------")


#for循环输出

g=(x*x for x in range(1,11))

for i in g:

print(i)

[/code]

输出结果:

D:\python3\python.exe D:/pycharm/workspace/demo/py8.py

[1, 4, 9, 16, 25, 36, 49, 64, 81, 100]

<generator object <genexpr> at 0x0000000002150F68>

<generator object <genexpr> at 0x0000000002150F68>

<generator object <genexpr> at 0x0000000002150FC0>

---------------------

1

4

9

---------------------

1

4

9

16

25

36

49

64

81

100


Process finished with exit code 0

[/code]

上面验证了生成器一边迭代一边计算下一个值的特性,每当我们调用next(g)一次他就会对应生成下一个值并返回


4.2)函数+yield关键字生成


函数的调用我们都应该很清楚,顺序执行return返回,但是带了yield关键字后的函数该怎么执行呢?yield关键字的函数也就是我们的generator在调用的时候是遇到yield关键字返回,然后再次调用的时候会紧接着上次返回的地方执行。

上面列表生成式创建generator的示例中讲到我们可以通过next()和for循环调用输出值,其实我们还有一种方式就是用send()的方式调用,那send()调用与next()调用不同的是send()可以实现与保存的算法进行传值这些简单的交互,从而改变原本应该输出的值,但是他不是在任何时候都能使用。接下来我们通过 函数+yield关键字创建generator 同时一起来看看send()的用法:

def mGenerator(value=1):

while 1:

value=yield value

print("value=",value)

if value:

value+=1

g=mGenerator()

print("---------g.send(None)-----------")

print(g.send(None))

print("---------next(g)-----------")

print(next(g))

print("---------next(g)-----------")

print(next(g))

print("---------g.send(5)-----------")

print(g.send(5))

[/code]

输出结果:

D:\python3\python.exe D:/pycharm/workspace/demo/py8.py

---------g.send(None)-----------

1

---------next(g)-----------

value= None

None

---------next(g)-----------

value= None

None

---------g.send(5)-----------

value= 5

6


Process finished with exit code 0

[/code]

我们来分析一下结果,首先我们实例化一个函数对象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()方法姿势不对的情况:

def mGenerator(value=1):

while 1:

value=yield value

print("value=",value)

if value:

value+=1

g=mGenerator()

print("---------g.send(1)-----------")

print(g.send(1))

[/code]

输出结果:

D:\python3\python.exe D:/pycharm/workspace/demo/py8.py

Traceback (most recent call last):

---------g.send(None)-----------

File "D:/pycharm/workspace/demo/py8.py", line 54, in <module>

print(g.send(1))

TypeError: can't send non-None value to a just-started generator


Process finished with exit code 1

[/code]

假比我一上来就给他调用一个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/ 感兴趣的朋友可以看看博主的文章,写的很不错。





接下来我们通过一段代码来验证一下上面说的

from collections import Iterable,Iterator


list_l=[12,34,56,67,33]

tuple_t=(1,2,3)

dict_d={"andy":23,"alice":18}

set_s=set(list_l)

str_s="my name is andy!"

g=(x*x for x in range(1,11))


print("list is Iterable:",isinstance(list_l,Iterable))

print("list is Iterator:",isinstance(list_l,Iterator))

print("iter(list) is Iterator:",isinstance(iter(list_l),Iterator))

print("--------------------------------------------")

print("tuple is Iterable:",isinstance(tuple_t,Iterable))

print("tuple is Iterator:",isinstance(tuple_t,Iterator))

print("iter(tuple) is Iterator:",isinstance(iter(tuple_t),Iterator))

print("--------------------------------------------")

print("dict is Iterable:",isinstance(dict_d,Iterable))

print("dict is Iterator:",isinstance(dict_d,Iterator))

print("iter(dict) is Iterator:",isinstance(iter(dict_d),Iterator))

print("--------------------------------------------")

print("set is Iterable:",isinstance(set,Iterable))

print("set is Iterator:",isinstance(set_s,Iterator))

print("iter(set) is Iterator:",isinstance(iter(set_s),Iterator))

print("--------------------------------------------")

print("str is Iterable:",isinstance(str_s,Iterable))

print("str is Iterator:",isinstance(str_s,Iterator))

print("iter(str) is Iterator:",isinstance(iter(str_s),Iterator))

print("--------------------------------------------")

print("generator is Iterable:",isinstance(g,Iterable))

print("generator is Iterator:",isinstance(g,Iterator))

[/code]

输出结果如下:

D:\python3\python.exe D:/pycharm/workspace/demo/py9.py

list is Iterable: True

list is Iterator: False

iter(list) is Iterator: True

--------------------------------------------

tuple is Iterable: True

tuple is Iterator: False

iter(tuple) is Iterator: True

--------------------------------------------

dict is Iterable: True

dict is Iterator: False

iter(dict) is Iterator: True

--------------------------------------------

set is Iterable: False

set is Iterator: False

iter(set) is Iterator: True

--------------------------------------------

str is Iterable: True

str is Iterator: False

iter(str) is Iterator: True

--------------------------------------------

generator is Iterable: True

generator is Iterator: True


Process finished with exit code 0

[/code]

ok,python的一些高级特性就简单学习这么多。

参考文章:

https://www.liaoxuefeng.com/wiki/0014316089557264a6b348958f449949df42a6d3a2e542c000/00143178254193589df9c612d2449618ea460e7a672a366000
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息