文章目录
第三节 高级特性
一 切片slice
适用于list、tuple、字符串的随意截取
语法:序列[开始位置下标:结束位置下标:步长],不包含结束位置下标对应的数据,步长默认为1
str1='abcdefg'
print(str1[0:4:2]) # ac —— 步长为2
# 创建一个0-99的list
L=list(range(100))
# 按一般方法,是新建一个list然后循环输出要截取的位置值
R=[]
for n in range(10):
R.append(L[n])
print(R) # [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
# 利用切片,直接截取
print(L[0:3]) # [0, 1, 2]
print(L[-3:-1]) # [97, 98] —— -1表示最后一个数据,但是结束位置下标取不了
# 对于tuple也是
T=tuple(range(50))
print(T[2:7]) # (2, 3, 4, 5, 6)
#对于字符串也是
a='ABCDEFG'
print(a) # ABCDEFG
print(a[:3]) # 从0开始的话可以省略0——ABC
print(a[4:]) # 省略后面的0直接默认到最后——EFG
print(a[:]) # 选取所有——ABCDEFG
print(a[::-1]) # -1表示从右向左选取,即倒叙排列——GFEDCBA
二 迭代iteration
即用for…in…完成,作用于一个可迭代对象
迭代 list
L=list(range(10))
for i in L:
print(i) # 0 1 2 3 4 5 6 7 8 9
迭代 dict的 Key
d={'a':1,'b':2,'c':3}
for key in d:
print(key) # a b c
迭代 dict的 value
for value in d.values():
print(value) # 1 2 3
迭代 dict的 key和 value
for k,v in d.items():
print(k) # 1 2 3
print(v) # a b c
print(k,'=',v) # a = 1 b = 2 c = 3
迭代字符串
for ch in 'ABCDE':
print(ch) # A B C D E
将 list迭代成索引 -元素对
for i,value in enumerate(['a','b']):
print(i,value) # 0 a 1 b
判断对象是否可迭代
from collections.abc import Iterable
print(isinstance('abc',Iterable)) # isinstance进行类型判断,是否为Iterable——True
三 列表生成式list comprehensions
用于创建不同的list
直接创建整数参数 list
L=list(range(1,11))
print(L) # [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
创建平方参数 list
L=[x*x for x in range(1,11)]
print(L) # [1, 4, 9, 16, 25, 36, 49, 64, 81, 100]
创建偶数的平方的 list
L=[x*x for x in range(1,11) if x%2==0]
print(L) # [4, 16, 36, 64, 100]
两层循环,全排列的 list
L=[m+n for m in 'ABC' for n in 'XYZ']
print(L) # ['AX', 'AY', 'AZ', 'BX', 'BY', 'BZ', 'CX', 'CY', 'CZ']
列出当前目录下所有文件和目录名
import os
L=[d for d in os.listdir('.')]
print(L) # ['.idea', 'main.py']
同时迭代多个变量
d={'a':'A','b':'B','c':'C'}
for k,v in d.items():
print(k,'=',v) # a = A b = B c = C
L=[k+'='+v for k,v in d.items()]
print(L) # ['a=A', 'b=B', 'c=C']
将 list中所有字符串变小写
L=['HELLO','World','IBM','Apple']
L1=[s.lower() for s in L]
print(L1) # ['hello', 'world', 'ibm', 'apple']
列表生成式中 if…else区别
L1=['HELLO','World',18,'Apple',None]
L2=[s.lower() if isinstance(s,str) else s for s in L1] # 表达式
L3=[s.lower() for s in L1 if isinstance(s,str)] # 筛选
print(L2) # ['hello', 'world', 18, 'apple', None]
print(L3) # ['hello', 'world', 'apple']
若if在for后,表示一个筛选条件,则不能带else
若if在for前,表示一个表达式,必须加else
四 生成器generaor
一边循环一边计算的机制
1、generaor
创建生成器 ()
g=(x*x for x in range(1,11))
print(L) # <generator object <genexpr> at 0x0000025AD92B2F10>
创建list最外层是[],generaor最外层是()
打印出生成器的值(用 for进行)
for n in g:
print(n) # 1 4 9 16 25 36 49 64 81 100
2、generaor函数
包含yield
普通函数
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
generaor函数
def gfib(max):
n,a,b=0,0,1
while n<max:
yield b # 只需要加yield就是生成器函数了
a,b=b,a+b
n=n+1
return 'done'
print(gfib(6)) # 直接打印——<generator object gfib at 0x0000021C03692F10>
for n in gfib(6):
print(n) # for打印内容,但是拿不到返回值——1 1 2 3 5 8
#generaor中打印返回值
while True:
try:
x=next(g)
print('g:',x) # g: 1 g: 1 g: 2 g: 3 g: 5 g: 8
except StopIteration as e: # 捕获StopIteration才能拿到返回值,包含在value中
print('return value:',e.value) # return value: done
break
generaor函数每次调用next的时候执行,遇到yield返回,再次执行时从上次返回的yield语句执行
def odd():
print('step 1')
yield 1
print('step 2')
yield (3)
print('step 3')
yield (5)
o=odd()
next(o) # step 1
next(o) # step 2
next(o) # step 3
next(o) # 第四次后没有yield了,程序报错——Traceback (most recent call last):StopIteration
# 调用generaor函数会创建一个generaor对象,多次调用generaor函数会创建多个相互独立的generaor
next(odd()) # step 1
next(odd()) # step 1
next(odd()) # step 1
# 这三个generaor完全独立,所以都从1开始
exp:杨辉三角
def triangles(m):
L=[1]
j=1
print(len(L))
while j<=m:
yield L
L=[1]+[L[i]+L[i+1] for i in range(len(L)-1)]+[1]
j=j+1
print(triangles(5))
for n in triangles(5):
print(n)
五 迭代器
直接作用于for循环的对象称可迭代对象 Iterable,可被next()函数调用并不断返回下一个值的对象称迭代器 Iterator**
判断是否为 Iterable对象
from collections.abc import Iterable
print(isinstance([],Iterable)) # True
print(isinstance(100,Iterable)) # False
判断是否是 Iterator对象
from collections.abc import Iterator
print(isinstance([],Iterator)) # False
print(isinstance((x for x in range(5)),Iterator)) # True
print(isinstance([1],Iterator)) # False
print(isinstance(iter([1]),Iterator)) # 变为Iterator对象——True
生成器都是Iterator对象,但是list、dict、str是 Iterable不是Iterator对象,将他们变为 Iterator可用iter() 函数
六 递归
函数内部自己调用自己且必须有出口
def sun_function(sum):
'''递归实现数字累加'''
if sum>1:
return sun_function(sum-1)+sum
return 1
a=3
resule=sun_function(3)
print(resule)
> 本文根据廖雪峰老师python课程和黑马程序员python课程进行记录