Python 内置的非常简单却强大的,可以⽤来创建 list 的⽣成式。
[x*x for x in range(1,7)]#这个就是列表⽣成式
运⽤列表⽣成式,可以将⽐较复杂的代码变得⽐较简洁
import os
[a for a in os.listdir('.')]
列表推导式的原理可以扩展到集合(set)和字典。
(1)集合
mult_list={i *j for i in range(3) for j in range(3) if i>0}
set中没有重复的值,创建set时会自动消除重复项。
(2)字典
字典推导式稍微复杂一些,需要先使用以下语法创建一个循环来生成键值对:key:value
假设我们有一个要作为数据字典基础的元组列表。
val_list=[('pi','3.14'),('phi','1.618')]
则可以用下面的代码生成字典:
mult_list={i[0]:i[1] for i in val_list}
mult_list #输出{'pi': '3.14', 'phi': '1.618'}
mult_list['pi']
可以使用内置zip函数合并列表来提高代码性能,代码如下:
keys=['bob','cob','ted','alice']
val=[1,2,3,4]
grade={keys:val for keys,val in zip(keys,val)}
grade
#输出:{'bob': 1, 'cob': 2, 'ted': 3, 'alice': 4}
字典推导式一种非常重要的用途就是反转字典。例如,你有一本电话薄,可以通过姓名查找号码,将其反转之后,则可以通过号码查找姓名。
idic={v:t for k,v in phone.items()}
字典的items方法会产生一给(k,v)键值对的列表,其中k是键,v是值,对于每个这样的对,值表达式v:k会在生成新字典idic时反转键值关系
⼀边循环⼀边计算的机制,称为⽣成器:generator。
#方法一:列表⽣成式的[]改成(),就创建了⼀个 generator
List = [ x*2 for x in range(5)]#range(5)==>0,1,2,3,4
print(List) #0,2,4,6,8
Generator = ( x*2 for x in range(5))
#如果要⼀个⼀个打印出来,可以通过 next() 函数获得⽣成器的下⼀个返回值
Generator = ( x*2 for x in range(5))
temp = next(Generator) #[0, 2, 4, 6, 8]
print(temp) #0
temp = next(Generator)
print(temp) #2
#注意:如果⼀直写next()函数,当超出了元素的个数范围时会直接报错
#方法二:如果推算的算法⽐较复杂,⽤类似列表⽣成式的 for 循环⽆法实现的时候,还可以⽤函数来实现。
def fib():
a = 0
b,c = 0,1
while a < 5:
yield c
# print(c)
b,c = c,b+c
a += 1
f = fib()
# print(next(f))
# print(next(f))
#⼀般使⽤for循环实现
for x in fib():
print(x)
⽣成器的特点:
可以直接作⽤于 for 循环的对象统称为可迭代对象。
可以被next()函数调⽤并不断返回下⼀个值的对象称为迭代器:Iterator。
以直接作用于 for 循环的数据类型有以下几种:
# 注:可以使⽤ isinstance() 判断⼀个对象是否是 Iterable 对象
from collections.abc import Iterable
a = isinstance([], Iterable)
b = isinstance({}, Iterable)
c = isinstance("abc", Iterable)
d = isinstance(100, Iterable)
e = isinstance((x for x in range(10)), Iterable)
print(a) #True
print(b) #True
print(c) #True
print(d) #False
print(e) #True
#注:可以使⽤ isinstance() 判断⼀个对象是否是 Iterator 对象
from collections.abc import Iterator
a = isinstance([], Iterator)
b = isinstance({}, Iterator)
c = isinstance("abc", Iterator)
d = isinstance(100, Iterator)
e = isinstance((x for x in range(10)), Iterator)
print(a) #false
print(b) #false
print(c) #false
print(d) #false
print(e) #true
为什么 list、dict、str 等数据类型不是 Iterator?
from collections import Iterator
a = isinstance(iter([]), Iterator)
b =isinstance(iter('abc'), Iterator)
print(a) #true
print(b) #tru
map() 会根据提供的函数对指定序列做映射。
map()⽅法的描述:创建⼀个迭代器,使⽤每个迭代项。当最短的迭代被耗尽时停⽌。
map()语法
map(function, iterable, ...)
a=(1,2,3,4,5)
b=[1,2,3,4,5]
c="zhangkang"
la=map(str,a)
lb=map(str,b)
lc=map(str,c)
print(list(la)) #['1', '2', '3', '4', '5']
print(list(lb)) #['1', '2', '3', '4', '5']
print(list(lc)) #['z', 'h', 'a', 'n', 'g', 'k', 'a', 'n', 'g']
def f(x):
return x*x
md=map(f,[1, 2, 3, 4, 5, 6, 7, 8, 9])
list(md) #[1, 4, 9, 16, 25, 36, 49, 64, 81]
reduce() 函数会对参数序列中元素进⾏累积。
#两个数的求和
#⽅式1:
from functools import reduce
def add(x,y):
return x + y
print (reduce(add, range(1, 101)))#5050
#⽅式2:
from functools import reduce
aa=reduce(lambda x,y:x+y,[1,2,3,4,5])
print(aa) #15
#获取每个词出现的次数(以空格分割)
from functools import reduce
aa="an apple a banana three apple a desk"
aa_split=aa.split(' ')
def fun(x,y):
if y in x:
x[y]=x[y]+1
else:
x[y]=1
return x
result=reduce(fun,aa_split,{})
print(result)
filter() 函数⽤于过滤序列,过滤掉不符合条件的元素,返回由符合条件元素组成的新列表。
list1 = [1, 2, 3, 4, 5, 6, 7, 8, 9]
def func(num):
if num % 2 == 0: # 偶数保留
return True
return False # 奇数剔除
l = filter(func, list1)
print(list(l)) #[2, 4, 6, 8]
sorted() 函数对所有可迭代的对象进⾏排序操作。
list1 = [4,7,2,6,3]
list2 = sorted(list1)#默认升序排序
#按绝对值⼤⼩排序
list3 = [4,-7,2,6,-3]
#key接受函数来实现⾃定义排序规则
list4 = sorted(list3, key=abs)
#函数可以⾃⼰写
def myLen(str):
return len(str)
list7 = ['b333','a1111111','c22','d5554']
list8 = sorted(list7,key=myLen)#默认升序排序
print(list8) #['c22', 'b333', 'd5554', 'a1111111']
每⼀次从待排序的数据元素中选出最⼩(或最⼤)的⼀个元素,存放到序列的起始位置,直到全部排完。
def selectionSort(alist):
for i in range(len(alist) - 1, 0, -1):
maxone = 0
for j in range(1, i + 1):
if alist[j] > alist[maxone]:
maxone = j
temp = alist[i]
alist[i] = alist[maxone]
alist[maxone] = temp
return alist
alist = [54, 26, 93, 17, 77, 31, 44, 55, 20]
print(selectionSort(alist))
第⼀趟:相邻的两数相⽐,⼤的往下沉。最后⼀个元素是最⼤的。
第⼆趟:相邻的两数相⽐,⼤的往下沉。最后⼀个元素不⽤⽐。
def bubbleSort(alist):
for passnum in range(len(alist)-1,0,-1):
for i in range(passnum):
if alist[i]>alist[i+1]:
temp = alist[i]
alist[i] = alist[i+1]
alist[i+1] = temp
return alist
alist = [54, 26, 93, 17, 77, 31, 44, 55, 20]
print(bubbleSort(alist)) #[17, 20, 26, 31, 44, 54, 55, 77, 93]