51.遍历字典中的元素
通过键值的方式进行遍历
dic = {"F": "1", "S": "2", "T": "3"}
for key1, value1 in dic.items():
print(key1, "=", value1)
输出:
F = 1
S = 2
T = 3
还有一种仅通过键进行遍历
dic = {"F": "1", "S": "2", "T": "3"}
for key1 in dic:
print(key1, "=", dic[key1])
输出:
F = 1
S = 2
T = 3
52.两个变量在列表生成式中的用法:
dic = {"F": "1", "S": "2", "T": "3"}
print([key1 + "=" + value1 for key1, value1 in dic.items()])
输出:
['F=1', 'S=2', 'T=3']
53.lower()方法
将一个字符串中所有字符变成小写
S = "This Is My Dream!"
print(S.lower())
输出:
this is my dream!
lower()在列表生成式中应用
L = ['Hello', 'World', 'IBM', 'Apple']
print([s.lower() for s in L])
输出:
['hello', 'world', 'ibm', 'apple']
小测试:
# -*- coding: utf-8 -*-
L1 = ['Hello', 'World', 18, 'Apple', None]
L2 = [s.lower() for s in L1 if isinstance(s, str)]
print(L2)
if L2 == ['hello', 'world', 'apple']:
print('测试通过!')
else:
print('测试失败!')
54.生成器-列表生成式类型的生成器
一边循环,一边计算,降低内存占用,提高效率
列表生成式:[i * i for i in range(1, 11)]
当把列表生成式的[]换成()之后,就是生成器的定义,生成器不能直接输出结果,可以用next()方法一个一个输出结果,或者用for循环进行输出
生成器:(i * i for i in range(1, 11))
直接打印生成器:print((i * i for i in range(1, 11)))
输出:
<generator object <genexpr> at 0x00000000023F1938>
会直接输出生成器对象的内存地址
如果要访问生成器中的元素,可以
print(next((i * i for i in range(1, 11))))
输出:
1
如果要访问后面的值可以把生成器赋值给一个对象
g = (i * i for i in range(1, 11))
print(next(g))
print(next(g))
print(next(g))
print(next(g))
输出:
1
4
9
16
当输出到最后一个元素,继续进行输出时,会报错
g = (i * i for i in range(1, 11))
print(next(g), end=" ")
print(next(g), end=" ")
print(next(g), end=" ")
print(next(g), end=" ")
print(next(g), end=" ")
print(next(g), end=" ")
print(next(g), end=" ")
print(next(g), end=" ")
print(next(g), end=" ")
print(next(g))
print(next(g))
输出:
1 4 9 16 25 36 49 64 81 100
StopIteration
这样输出显然不好,所以应该使用for循环进行输出
g = (i * i for i in range(1, 11))
for i in g:
print(i, end=" ")
输出:
1 4 9 16 25 36 49 64 81 100
55.一次多赋值
a, b = b, a + b
这种写法其实是采用了一个中间的元组来过渡
t = (b, a + b)
a = t(0)
b = t(1)
56.生成器-函数类型的生成器
在函数中加入yield语句,yield语句是返回一个值
定义成生成器的函数,通过调用next()来执行,不是顺序执行的,在遇到yield语句后返回,当下次调用next()方法时,从上次返回yield的地方继续执行
例子定义一个求斐波那契数列的函数
def fib(max):
n, a, b = 0, 0, 1
while n < max:
yield b
a, b = b, a + b
n = n + 1
return 'done'
f = fib(7)
print(next(f), end=" ")
print(next(f), end=" ")
print(next(f), end=" ")
print(next(f), end=" ")
print(next(f), end=" ")
print(next(f), end=" ")
print(next(f))
输出:
1 1 2 3 5 8 13
调用next的次数过多还是会报错,一般不用next,而是用for循环
杨辉三角
def triangles():
N = [1]
while True:
yield N
S=N[:]
S.append(0)
N = [S[i-1] + S[i] for i in range(len(S))]
57.可迭代对象(Iterable)和迭代器对象(Iterator)
可迭代对象,是可以通过for循环进行使用的
迭代器对象不仅可以通过for循环进行使用,而且可以通过next进行调用
因此列表、元组、字符串是可迭代对象,但不是迭代器对象
而生成器既是可迭代对象也是迭代器对象
可以通过iter()函数,将可迭代对象转化成为迭代器对象
58.高阶函数
高阶函数就是让函数本身作为变量,参与到函数运算当中,或者将函数本身作为函数的输出
假设三角函数中,知道一个角度a,求这个角度的tan(a)值,tan(a)=sin(a)/cos(a);sin和cos也是一个函数,因此可以定义一个tan()函数
import math
def tan1(a, sin, cos):
return sin(a)/cos(a)
print(tan1(3, math.sin, math.cos))
输出:
-0.1425465430742778
本例子仅仅是为了说明,函数也能作为参数传入另外一个函数,真正在使用过程中,math模块中有直接求tan()的函数,可以直接使用
注意一下,在传参数时候都是传的是函数的名称,而不是函数方法
在定义tan1的时候的名称可以随意定义
import math
def tan1(a, c, d):
return c(a)/d(a)
print(tan1(3, math.sin, math.cos))
这样同样能够使用,但是为了阅读起来比较方便,定义时还是最好使用有意义的名称进行定义。
59.map()函数
map()函数接收两个参数,一个是函数,一个是可迭代的对象,返回一个迭代器对象
作用就是把迭代对象中的每个元素通过函数运算,组成一个迭代器对象返回
L = [1, 2, 3, 4, 5, 6]
def f(x):
return x*x
I = map(f, L)
for i in I:
print(i)
输出:
1
4
9
16
25
36
内置的函数也可使用该方法
L = [1, 2, 3, 4, 5, 6]
I = map(str, L)
for i in I:
print(i)
输出:
1
2
3
4
5
6
此处为字符串类型的
60.reduce()函数(暂时没有理解这样做的优势,以后用到了再了解)
reduce函数在python3中已经被放到functools模块中,在使用前先要导入functools模块
from functools import reduce
def add(x,y):
return x + y
print(reduce(add, range(1, 101)))
输出:
5050
其作用是将第一运行的结果作为第二次运行的参数进行下一次运行,不断累积
采用匿名函数之后,代码会变得非常简单
print(reduce(lambda x, y: x+y, [1,2,3,4,5]))