python学习笔记-高级特性 20200309

文章目录

    • 高级特性
      • 切片
        • exercise
      • 迭代
        • 定义
        • 迭代dict对象:
        • 迭代字符串对象
        • 判断是否为可迭代对象
        • 对list类实现下标循环
          • exercise
        • 小结
      • 列表生成式
        • 生成list
        • 列出当前目录下所有文件和目录名
        • 使用两个变量生成list
        • 列表生成式中if...else
        • 练习
        • 小结
      • 生成器
        • 定义
        • 创建generator
        • 斐波拉契数列(Fibonacci)
        • 杨辉三角形
      • 迭代器
        • 小结

高级特性

切片

1 . 取一个list或tuple的部分元素,如:

  • 取正数元素
L=['M','S','T','B','J']
[L[0],L[1],L[2]]               #a.笨办法
r=[]
n=3
for i in range(n):
    r.append(L[i])           #b.循环方法
L[0:3]                         #c.切片法
  • 取倒数元素
L[-1]         #取倒数第一个元素
L[-2:]        #取倒数第二个和倒数第一个元素
  • list例子
    • 数字
      L=list(range(100)) #创建一个0:99的数列
      L[:10]
      L[-10:]
      L[10:20]
      L[:10:2] #前十个数,每两个取一个
      L[::5] #所有数,每五个取一个
      L[:] #原样复制一个list
    • 字符串’xxx’
      ‘ABCDEFG’[:3]
  • tuple例子
    (0,1,2,3,4,5)[:3] #取前三个数

exercise

利用切片操作,实现实现一个trim()函数,去除字符串首尾的空格:

def trim(s)
if s[0] != ' ' and s[-1] !=' '
    return s
elif s[0] == ' '
    return s[1:]
elif s[-1] == ' '
    return s[:-1]

迭代

定义

如果给定一个list或tuple,我们可以通过for循环遍历这个list或tuple,这种遍历我们称为迭代(Iteration)。
Python中,迭代是通过for … in来完成的
如:

迭代dict对象:

  • 迭代key:默认dict迭代的是key
d={'a',:1'b':2,'c':3}
for key in d:
    print(key)
  • 迭代value:
for value in d.values():
	print(value)
  • 同时迭代key和value:用for k,v in d.items()
for k,v in d.items():
	print(value)

迭代字符串对象

for ch in 'ABC'
print(ch)

判断是否为可迭代对象

通过collections模块的Iterable类型判断

from collections import Iterable
isinstance('abc',Iterable)

对list类实现下标循环

使用enumerate函数,可以把一个list变成索引-元素对,这样就可以在for循环中同时迭代索引和元素本身

for i,value in enumerate(['A','B','C']):
    print(i,value)
>>> for x,y in[(4,5),(2,3),(1,1)]:
	print(x,y)

	
4 5
2 3
1 1
exercise

请使用迭代查找一个list中最小和最大值,并返回一个tuple:

def findMinAndMax(L):
	if len(L)!=0:
		min=99999999
		max=-99999999
		for i in L:
			if imax:
				max=i
		return min,max
	else:
		return(None,None)

小结

  • 任何可迭代对象都可以作用于for循环,包括我们自定义的数据类型,只要符合迭代条件,就可以使用for循环。

列表生成式

生成list

  • list(range(1,11)) 生成list[1,2,3,4,5,6,7,8,9,10]
  • 生成[1x1, 2x2, 3x3, …, 10x10],
L=[]
for x in range(1,11):
    L.append(x*x)


[x*x for x in range(1,11)] #列表生成式
把要生成的元素x * x放到前面,后面跟for循环

  • 加判断

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

  • 两层循环,生成全排列

[m+n for m in 'ABC' for n in 'XYZ']

列出当前目录下所有文件和目录名

可以通过一行代码实现

import os   #导入os模块
[d for d in os.listdir('.')]            #os.listdir可以列出文件和目录

使用两个变量生成list

d = {'x':'A','y':'B','z':'C' }
[k + '=' + v for k , v in d.items()]
  • 字符串变小写:s.lower()

列表生成式中if…else

用法:
[x if x % 2 == 0 else -x for x range(1,11)]
=>[x if … else for x in …]

练习

L=['Hello','World',18,'Apple',None]
[x.lower() if isinstance(x,str) else x for x in L]

小结

运用列表生成式,可以快速生成list,可以通过一个list推导出另一个list,而代码却十分简洁。


生成器

定义

生成器:一边循环一边计算,generator

创建generator

方法一:

  • 把一个列表生成式的[]改成()
g = (x * x for x in range(10))             #创建generator
  • 打印:
    1.通过**next()**函数获得generator的下一个返回值

2.循环实现

g = (x * x for x in range(10))             #创建generator
for n in g:
    print(n)

斐波拉契数列(Fibonacci)

普通写法

def fib(max):
    n,a,b,0,0,1
    while n
  • 注意:赋值语句a,b=b,a+b为给a和bi分别赋值为b和a+b
    generator写法
  • 把print(b)改成yield b
def fib(max):
    n,a,b=0,0,1
    while  n

把函数改成generator后,我们基本上从来不会用next()来获取下一个返回值,而是直接使用for循环来迭代:

for n in fib(6):
    print(n)

但是用for循环调用generator时,发现拿不到generator的return语句的返回值。如果想要拿到返回值,必须捕获StopIteration错误,返回值包含在StopIteration的value中:

g = fib(6)
>>> while True:
...     try:
...         x = next(g)
...         print('g:', x)
...     except StopIteration as e:
...         print('Generator return value:', e.value)
...         break

杨辉三角形

method1

def triangles()
f=[]
while True:
    f=[f[i-1]+f[i] if i!=0 and i!=len(f) else 1 for i in range(len(f)+1)]
yield f

method2

def triangles()
a=[1]
while True:
    yield a
    a.append(0)
    a=[a[i-1]+a[i] for i in range(len(a))]

##调用

n=0
for t in triangles():
    print(t)
    n=n=+1
    if n==10:
    break

result:
[1]
[1, 1]
[1, 2, 1]
[1, 3, 3, 1]
[1, 4, 6, 4, 1]
[1, 5, 10, 10, 5, 1]
[1, 6, 15, 20, 15, 6, 1]
[1, 7, 21, 35, 35, 21, 7, 1]
[1, 8, 28, 56, 70, 56, 28, 8, 1]
[1, 9, 36, 84, 126, 126, 84, 36, 9, 1]

迭代器

可以直接作用于for循环的数据类型有以下几种:
①集合数据类型,如list、tuple、dict、set、str等
②generator,包括生成器和带yield的generator function

  • 可以直接作用于for循环的对象统称为可迭代对象:Iterable。
    可以使用isinstance()判断一个对象是否是Iterable对象
  • 生成器不但可以作用于for循环,还可以被next()函数不断调用并返回下一个值,直到最后抛出StopIteration错误表示无法继续返回下一个值了

  • 可以被next()函数调用并不断返回下一个值的对象称为迭代器:Iterator。
  • 可以使用isinstance()判断一个对象是否是Iterator对象

from collections import Iterator
isinstance((x for x in range(10)), Iterator)

  • 生成器都是Iterator对象,但list、dict、str虽然是Iterable(可迭代),却不是Iterator
  • ist、dict、str等Iterable变成Iterator可以使用iter()函数:

  • 判断是否为迭代器
>>> isinstance(iter([]), Iterator)
True
>>> isinstance(iter('abc'), Iterator)
True

其中iter(‘abc’)就是把str转化为Iterator


  • 判断是否为可迭代对象:
    通过collections模块的Iterable类型判断
from collections import Iterable
isinstance('abc',Iterable)

注意:
list、dict、str等数据类型不是Iterator:
原因:

  • Python的Iterator对象表示的是一个数据流,Iterator对象可以被next()函数调用并不断返回下一个数据,直到没有数据时抛出StopIteration错误。可以把这个数据流看做是一个有序序列,但我们却不能提前知道序列的长度,只能不断通过next()函数实现按需计算下一个数据,所以Iterator的计算是惰性的,只有在需要返回下一个数据时它才会计算。
  • Iterator甚至可以表示一个无限大的数据流,例如全体自然数。而使用list是永远不可能存储全体自然数的。

小结

  • 凡是可作用于for循环的对象都是Iterable类型;
  • 凡是可作用于next()函数的对象都是Iterator类型,它们表示一个惰性计算的序列;
  • 集合数据类型如list、dict、str等是Iterable但不是Iterator,不过可以通过iter()函数获得一个Iterator对象。
  • Python的for循环本质上就是通过不断调用next()函数实现的,例如:
for x in [1, 2, 3, 4, 5]:
    pass

实际上完全等价于:

# 首先获得Iterator对象:
it = iter([1, 2, 3, 4, 5])
# 循环:
while True:
    try:
        # 获得下一个值:
        x = next(it)
    except StopIteration:
        # 遇到StopIteration就退出循环
        break

你可能感兴趣的:(python学习笔记,python)