Python学习笔记-06

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

扫描二维码关注公众号,回复: 5158703 查看本文章

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]))

猜你喜欢

转载自www.cnblogs.com/tangnightmare/p/10360903.html