Python高级特性(切片,迭代,列表生成式、生成器、迭代器)

本文详细介绍了Python中的切片、迭代、列表生成式及生成器的概念与使用方法,并通过具体实例加深理解。
一、切片:取出list或者tuple的任意 元素(部分或者所有
      1. 语法:L[a:b:c]  ,表示取出L中的从a到b的元素,每c个取一次,当a为0时可以省略不写即L[:b:c],当c为1时可以不写即L[a:b],
eg:  lis=[1,2,3,4,5,6]
       print(lis[0:5:2])#输出[1, 3, 5],从0到5(含前 不含后,包0不包5,即索引0到4),每2个元素取一次
      切片也支持逆序,上述print(list(L[-5:])) 输出结果为[2, 3, 4, 5, 6]即从-5到-1, 记住倒数第一个元素的索引是-1
     2 tuple也是一种list,唯一区别是tuple不可变。因此,tuple也可以用切片操作,只是操作的结果仍是tuple
     eg:print((10,11,12,13,13,14,15)[:3])输出结果为(10, 11, 12)
    3.字符串也是一种list,也可以进行切片操作
    eg: print('ABCDEFG'[::3])输出结果为ADG
      综合栗子:利用切片操作,实现一个trim()函数,去除字符串首尾的空格,注意不要调用str的 strip()方法  
st='   abc   '
print(st.strip())
def trim(S):
	s=''
	for x in S:
		if x==' ':			
			continue
		else:
			s=s+x
	return s
print(trim(st))	
二、 迭代:给定一个list或tuple,我们可以通过 for ... in来遍历这个list或tuple,这种遍历我们称为迭代(Iteration),除了list和tupe之外还可以迭代 任何其他可迭代的对象,比如字符串,dirct等
判断一个对象是可迭代对象呢?方法是通过collections模块的Iterable类型判断    
from collections import Iterable
print(isinstance('abc',Iterable))
print(isinstance(23,Iterable))#整数是不可迭代的
Python内置的 enumerate函数可以把一个list变成索引-元素对,
for i,value in enumerate(['A','B','C']):#通过enumerate函数可以把一个list变成索引元素对
	print(i,value)
迭代dirct
for key in d:#迭代key
	print(key)
for value in d.values():#迭代value
	print(value)
for key,value in d.items():#迭代key value
	print(key,value)
综合栗子:用迭代查找一个list中最小和最大值,并返回一个tuple
def findMinAndMax(L):
	min=L[0]
	max=L[0]
	for x in L:
		if x<min:
			min=x
		if x>max:
			max=x
	return (min,max)
print(findMinAndMax([12,34,23]))
三、列表生成式:将一种运算规则作用于一个列表从而生成一个新的列表
print([x*x for x in range(1,11)])#生成[1x1, 2x2, 3x3, ..., 10x10]
将乘方运算作用于一个list,输出[1, 4, 9, 16, 25, 36, 49, 64, 81, 100]
print([m+n for m in 'ABC' for n in 'XYZ'])#双层循环
输出['AX', 'AY', 'AZ', 'BX', 'BY', 'BZ', 'CX', 'CY', 'CZ']
双层循环可以作用于多个对象
d = {'x': 'A', 'y': 'B', 'z': 'C' }
print([k+'='+v for k,v in d.items()])
输出['y=B', 'z=C', 'x=A']
综合栗子:list中所有的字符串变成小写
L1 = ['Hello', 'World', 18, 'Apple', None]
print([s.lower() for s in L1 if isinstance(s,Iterable)])
四、生成器(generator),在Python中,这种一边循环一边计算的机制,称为生成器(Generator)属于列表生成式的进化,比列表生成式更节约内存,
1.创建方式一:将列表生成式的[]改为(),eg
g=(x*x for x in range(10))
生成器的核心在于算法,如果算法比较复杂可以将算法写成函数
2..创建方式二:一个函数 中含有yield关键字
      变成generator的函数,在每次调用 next()的时候执行,遇到 yield语句返回,再次执行时从 上次返回的yield语句处继续执行。
eg:
def odd():
	print('step1')
	yield 1
	print('step2')
	yield 2
	print('step3')
	yield 3
s=odd()
print(next(s))#python3.x中next()函数代替2.x中的.next()方法
print(next(s))
print(next(s))
输出结果为
综合栗子:

杨辉三角定义如下:

          1
         / \
        1   1
       / \ / \
      1   2   1
     / \ / \ / \
    1   3   3   1
   / \ / \ / \ / \
  1   4   6   4   1
 / \ / \ / \ / \ / \
1   5   10  10  5   1

把每一行看做一个list,试写一个generator,不断输出下一行的list:

def triangles(n): #共n行但是下标是从0-(n-1)
    i=0
    L=[1]    
    if n<0:
        return
    elif n==1:    
        yield L         
    else:
        if i==0:
            i=i+1
            yield L
        while i<=n:                    
            L=[1]+[L[x]+L[x+1] for x in range(i-1)]+[1]                                         
            yield L 
            i=i+1    
for l in triangles(6):
    print(l)
运行结果:


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值