高级特性
print(list(range(1, 100, 2)))
- 切片
#切片 字符串,对象,数组都可以使用
print(list(range(1, 100, 2)))
list1 = ['Michael', 'Sarah', 'Tracy', 'Bob', 'Jack']
# 取数组前n个元素 0 - (n-1), 取出前3个元素,如果第一个索引是0,还可以省略:
print(list1[:3])
print(list1[1:3])
print(list1[-2:-1])
list2 = list(range(1, 100))
# 取前10个,每隔2个取一个
print(list2[:10:2])
# 所有数,戈2个取一个
print(list2[::2])
# 这样会直接复制一个list
list3 = list2[:]
# print(list3)
# 去除左右空格
def trim (s):
while s[:1] == ' ':
s = s[1:]
trim(s)
while s[-1:] == ' ':
s = s[0:-1]
trim(s)
return s
- 迭代 for in
#迭代 for in
# 对象,数组,字符串都可以
# 对象 如果要同时迭代key和value,可以用for k, v in d.items() , 如果要迭代value,可以用for value in d.values()
# 数组,如果想要下标,可以使用enumerate函数: for i, value in enumerate(['A', 'B', 'C']):
# 判断是否可以迭代
from collections import Iterable
isinstance('abc', Iterable) # str是否可迭代
isinstance([1,2,3], Iterable) # list是否可迭代
isinstance(123, Iterable) # 整数是否可迭代
# 迭代数组 返回tuple
for x, y in [(1, 1), (2, 4), (3, 9)]:
print(x, y)
# 查找最大最小的值
def findMinAndMax(L):
if not L:
return(None, None)
max = min = L[0]
for n in L:
if max < n:
max = n
if min > n:
min = n
return (min, max)
- 列表生成式
# 生成[1x1, 2x2, 3x3, ..., 10x10]怎么做
# list4 = []
# for x in range(1, 11):
# list4.append(x * x)
# 或者
list4 = [ x * x for x in range(1, 11)]
print(list4)
# 两层循环
print([m + n for m in 'ABC' for n in 'XYZ'])
# for循环后面还可以加上if判断,这样我们就可以筛选出仅偶数的平方:
#[x * x for x in range(1, 11) if x % 2 == 0]
# 列出当前目录下所有文件和目录
# d = {'x': 'A', 'y': 'B', 'z': 'C' }
# for k, v in d.items():
# print(k, '=', v)
# [k + '=' + v for k, v in d.items()] 生成数组
# L = ['Hello', 'World', 'IBM', 'Apple']
# [s.lower() for s in L]
import os
print([d for d in os.listdir('.')])
# 请修改列表生成式,通过添加if语句保证列表生成式能正确地执行:
list5 = ['Hello', 'World', 18, 'Apple', None]
list6 = [x.lower() for x in list5 if isinstance(x, str)]
print(list6)
- 生成器 generator
# 生成器 generator。
# 如果列表元素可以按照某种算法推算出来,那我们是否可以在循环的过程中不断推算出后续的元素呢?这样就不必创建完整的list,从而节省大量的空间。在Python中,这种一边循环一边计算的机制,称为生成器
g1 = (x * x for x in range(10))
print(g1)
print(next(g1))
print(next(g1))
# 正确的方式,应该使用for循环
for n in g1:
print(n)
#
# 斐波拉契数列 generator函数
def fib(max):
n, a, b = 0, 0, 1
while n < max:
#print(b)
yield b
# 赋值语句:
a, b = b, a + b
n = n + 1
return 'done'
# 普通函数直接调用
# fib(6)
# 生成器函数 for 循环, 不然只能通过next函数一次一次的调用,如果调用次数多了,会报错
for n in fib(6):
print(n)
# 杨辉三角
def triangles(n):
l = [1]
while True:
yield l
# 第一次中间是空数组
l = [1] + [l[x] + l[x + 1] for x in range(len(l) - 1)] + [1]
if len(l) > n:
break
for linevalue in triangles(10):
print(linevalue)
- 迭代器
# 迭代器
# for循环的数据类型有以下几种:
# 一类是集合数据类型,如list、tuple、dict、set、str等;
# 一类是generator,包括生成器和带yield的generator function。
# 这些可以直接作用于for循环的对象统称为可迭代对象:Iterable。
# 可以使用isinstance()判断一个对象是否是Iterable 枚举对象:
from collections import Iterable, Iterator
print(isinstance([], Iterable))
isinstance({}, Iterable)
isinstance('abc', Iterable)
print(isinstance((x for x in range(10)), Iterable))
# # 可以被next()函数调用并不断返回下一个值的对象称为迭代器:Iterator。
# # 可以使用isinstance()判断一个对象是否是Iterator对象:
print(isinstance((x for x in range(10)), Iterator)) # True
print(isinstance([], Iterator)) # Flase
# 但是可以通过iter()函数转为Iterator
print(isinstance(iter([]), Iterator))
# Python的for循环本质上就是通过不断调用next()函数实现的
# 首先获得Iterator对象:
# it = iter([1, 2, 3, 4, 5])
# # 循环:
# while True:
# try:
# # 获得下一个值:
# x = next(it)
# except StopIteration:
# # 遇到StopIteration就退出循环
# break
# 等同于
# for x in [1, 2, 3, 4, 5]:
# pass