1.匿名函数
2.enumerate内置函数
3.列表生成式
4.print中的end
5.生成器generator
6.可迭代对象和迭代器
7.Python文件目录路径的选择

1.匿名函数

匿名函数:不需要显示的指定函数名,匿名函数支持的最复杂的运算就是三元运算
lambda也是一个简短的匿名函数,格式:lambda 参数 : 表达式

举例说明:

1
2
3
4
x = lambda a, b, c : a + b + c
print(x(5, 6, 2)) # 13
func = lambda x,y:x*y # 声明一个匿名函数并赋值给func
print(func(3,8)) # 输出结果为24

2.enumerate内置函数

对于一个可迭代的(iterable)/可遍历的对象(如列表、字符串),enumerate将其组成一个索引序列,利用它可以同时获得索引和值

1
2
3
4
5
6
7
8
9
list1 = ["这", "是", "一个", "测试"]
for index, item in enumerate(list1):
print(index, item)
"""
0 这
1 是
2 一个
3 测试
"""

3.列表生成式

列表生成式格式:[执行语句 列表生成]:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
# 写列表生成式时,把要生成的元素x * x放到前面,后面跟for循环,就可以把list创建出来
>>> [x * x for x in range(1, 11)]
[1, 4, 9, 16, 25, 36, 49, 64, 81, 100]

# for循环后面还可以加上if判断,这样我们就可以筛选出仅偶数的平方
>>> [x * x for x in range(1, 11) if x % 2 == 0]
[4, 16, 36, 64, 100]

# 用三元运算生成列表
>>> a = range(1,11)
>>> a = [i if i < 5 else i*i for i in a]
>>> a
[1, 2, 3, 4, 25, 36, 49, 64, 81, 100]

# 使用两层循环,可以生成全排列
>>> [m + n for m in 'ABC' for n in 'XYZ']
['AX', 'AY', 'AZ', 'BX', 'BY', 'BZ', 'CX', 'CY', 'CZ']

# 列表生成式也可以使用两个变量来生成list
>>> d = {'x': 'A', 'y': 'B', 'z': 'C' }
>>> [k + '=' + v for k, v in d.items()]
['x=A', 'y=B', 'z=C']

# 字符串操作,都变为小写
>>> L = ['Hello', 'World', 'IBM', 'Apple']
>>> [s.lower() for s in L]
['hello', 'world', 'ibm', 'apple']

      通过列表生成式可以直接创建一个列表。列表创建在内存中,因此列表容量受到内存限制。特别是对一个元素量很大的列表,仅需访问前几个元素时,尤其浪费空间

4.print中的end

为末尾end传递一个空字符串,这样print函数不会在字符串末尾添加一个换行符,而是添加一个空字符串

print默认是打印一行,结尾加换行。end=’’意思是末尾不换行,加空格。

5.生成器generator

      列表元素可以按照某种算法推算出来(有规律的数组),则可以在循环的过程中不断推算出后续的元素。这种方式就不必创建完整的list,可以节省大量的空间。python中,这种一边循环一边计算的机制,称为生成器:generator。

生成器创建方法一:将列表生成式的‘[]’改为‘()’

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
# 生成器保存的是公式,取一次创建一次,只能往前不能后退
>>> a2 = (i for i in range(1000))
>>> a2
<generator object <genexpr> at 0x103761a98>
>>> next(a2)
0
>>> next(a2)
1

#生成器走完时,会报错:StopIteration
>>> a3 = (i for i in range(5)) # 限制5个
>>> a3
<generator object <genexpr> at 0x103761e08>
>>> next(a3)
0
>>> next(a3)
1
>>> next(a3)
2
>>> next(a3)
3
>>> next(a3)
4
>>> next(a3)
Traceback (most recent call last):
File "<input>", line 1, in <module>
StopIteration

生成器保存的是算法,每次调用next(g)就计算出g的下一个元素的值,直到计算出最后一个元素,没有更多的元素时,抛出StopIteration的错误。

创建生成器后,很少会调用next(),一般是通过for循环来迭代。使用for循环(有且仅有for循环满足)来迭代生成器,不会出现StopIteration报错,直接结束

1
2
3
4
5
6
7
# 创建一个生成器a
a = (i for i in range(10))
# a=<generator object demo2.<locals>.<genexpr> at 0x0000026556A46B10>
print(a)
for i in a:
print(i, end=" ") # end="strings",end表示每行连接格式
# 结果为:0 1 2 3 4 5 6 7 8 9

生成器创建方法二:一个函数定义中包含yield关键字,函数为生成器(generator)
这种生成器和函数相似,但与函数的执行流程不同:

  函数是顺序执行,遇到return语句或最后一行函数语句就返回。

  函数转化为生成器后,在每次调用next()的时候执行,遇到yield语句返回,再次执行时从上次返回的yield语句处继续执行

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
>>> def fib_g(max):
... n, a, b = 0, 0, 1
... while n < max:
... print('before yield')
... yield b # yield 把函数的执行过程冻结在这一步,并且把b的值返回给外面的next()
... print(b)
... a, b = b, a+b
... n = n + 1
... return 'done'
...
>>> f = fib_g(15) # 将函数转换为生成器,有了yeild后,函数名(参数)根本不执行
>>> next(f)
before yield
1
>>> next(f)
1
before yield
1
>>> next(f)
1
before yield
2
>>> next(f)
2
before yield
3
>>> next(f)
3
before yield
5

总结:

  1. send(“Strings”)方法:①唤醒并继续执行,直到遇到下一个yield ②发送一个信息到生成器内部
  2. next():唤醒冻结的函数执行过程,继续执行,直到遇到下一个yield

6.可迭代对象和迭代器

可直接作用于for循环的数据类型有一下几种:

一、集合数据类型,如:list、tuple、dict、set、str等;

二、generator,包括生成器表达式(geneator expression)和生成器函数(generator function)两组构建方式。

上述这些可以直接作用于for循环的对象统称为可迭代对象(Iterable)。

7.Python文件目录路径的选择

显示的文件目录用“/”,使用../ 表示的是表示上一级目录(也可以理解为 上一级文件夹,上行一个文件夹;就是文件夹HeadFirstPython/ chapter3往上一级,就到达目录文件夹/Users/barryp)

./ 表示的是当前目录,“../../”表示上上级的目录(上行两个文件夹)

绝对路径:即从最大的根目录开始表示,一直到该文件名。

相对路径:即该文件自己相对于目标(另一个文件)位置。不论将这些文件放到哪里,只要他们的相对关系没有变,就不会出错。

参考文献


 评论

联系我 | Contact with me

Copyright © 2019-2020 谁知你知我,我知你知深。此恨经年深,比情度日久

博客内容遵循 署名-非商业性使用-相同方式共享 4.0 国际 (CC BY-NC-SA 4.0) 协议