您的位置:首页 > 编程语言 > Python开发

中国大学 MOOC 课程 《Python 语言程序设计》第六周

2017-12-03 19:30 1826 查看

中国大学 MOOC 课程 《Python 语言程序设计》第六周

一、lambda函数

1,lambda的一般形式是关键字lambda后面跟一个或多个参数,紧跟一个冒号,以后是一个表达式。lambda是一个表达式而不是一个语句。它能够出现在Python语法不允许def出现的地方。作为表达式,lambda返回一个值(即一个新的函数)。lambda用来编写简单的函数,而def用来处理更强大的任务。

[python] view plain copy

f = lambda x,y,z : x+y+z

print f(1,2,3)

g = lambda x,y=2,z=3 : x+y+z

print g(1,z=4,y=5)

输出结果为:

[python] view plain copy

6

10

2,lambda表达式常用来编写跳转表(jump table),就是行为的列表或字典。例如:

[python] view plain copy

L = [(lambda x: x**2),

(lambda x: x**3),

(lambda x: x**4)]

print L0,L1,L2

D = {‘f1’:(lambda: 2+3),

‘f2’:(lambda: 2*3),

‘f3’:(lambda: 2**3)}

print D‘f1’,D‘f2’,D‘f3’

输出结果为:

[python] view plain copy

4 8 16

5 6 8

3,lambda表达式可以嵌套使用,但是从可读性的角度来说,应尽量避免使用嵌套的lambda表达式。

4,map函数可以在序列中映射函数进行操作。例如:

[python] view plain copy

def inc(x):

return x+10

L = [1,2,3,4]

print map(inc,L)

print map((lambda x: x+10),L)

输出结果为:

[python] view plain copy

[11, 12, 13, 14]

[11, 12, 13, 14]

5,列表解析可以实现map函数同样的功能,而且往往比map要快。例如:

[python] view plain copy

print [x**2 for x in range(10)]

print map((lambda x: x**2), range(10))

输出结果为:

[python] view plain copy

[0, 1, 4, 9, 16, 25, 36, 49, 64, 81]

[0, 1, 4, 9, 16, 25, 36, 49, 64, 81]

6,列表解析比map更强大。例如:

[python] view plain copy

print [x+y for x in range(5) if x%2 == 0 for y in range(10) if y%2 ==1]

输出结果为:

[python] view plain copy

[1, 3, 5, 7, 9, 3, 5, 7, 9, 11, 5, 7, 9, 11, 13]

7,生成器函数就像一般的函数,但它们被用作实现迭代协议,因此生成器函数只能在迭代语境中出现。例如:

[python] view plain copy

def gensquares(N):

for i in range(N):

yield i**2

for i in gensquares(5):

print i,

输出结果为:

[python] view plain copy

0 1 4 9 16

8,所有的迭代内容(包括for循环、map调用、列表解析等等)将会自动调用iter函数,来看看是不是支持了迭代协议。

9,生成器表达式就像列表解析一样,但它们是扩在圆括号()中而不是方括号[]中。例如:

[python] view plain copy

for num in (x**2 for x in range(5)):

print num,

输出结果为:

[python] view plain copy

0 1 4 9 16

10,列表解析比for循环具有更好的性能。尽管如此,在编写Python代码时,性能不应该是最优先考虑的。

11,没有return语句时,函数将返回None对象。

12,函数设计的概念:

耦合性:只有在真正必要的情况下才使用全局变量

耦合性:不要改变可变类型的参数,除非调用者希望这样做

耦合性:避免直接改变另一个文件模块中的变量

聚合性:每一个函数都应有一个单一的、统一的目标

13,最后给个默认参数和可变参数的例子:

[python] view plain copy

def saver(x=[]):

x.append(1)

print x

saver([2])

saver()

saver()

saver()

输出结果为:

[python] view plain copy

[2, 1]

[1]

[1, 1]

[1, 1, 1]

二、map函数:

Python中map()、filter()、reduce()这三个都是应用于序列的内置函数。

格式:

map(func, seq1[, seq2,…])

第一个参数接受一个函数名,后面的参数接受一个或多个可迭代的序列,返回的是一个集合。

Python函数编程中的map()函数是将func作用于seq中的每一个元素,并将所有的调用的结果作为一个list返回。如果func为None,作用同zip()。

1、当seq只有一个时,将函数func作用于这个seq的每个元素上,并得到一个新的seq。

让我们来看一下只有一个seq的时候,map()函数是如何工作的。

work

从上图可以看出,函数func函数会作用于seq中的每个元素,得到func(seq
)组成的列表。下面举得例子来帮助我们更好的理解这个工作过程。

使用lambda

print map(lambda x: x % 2, range(7))

[0, 1, 0, 1, 0, 1, 0]

三、list函数:

本函数是创建一个列表对象返回。列表对象是一个可修改的容器

list(9,10)=[9,10]

list(“liu”)=[l,i,u]

四、

import turtle

def main():
#设置窗口信息
turtle.title('数据驱动的动态路径绘制')
turtle.setup(800, 600, 0, 0)
#设置画笔
pen = turtle.Turtle()
pen.color("red")
pen.width(5)
pen.shape("turtle")
pen.speed(5)
#读取文件
result=[]
file = open("data.txt","r")
for line in file:
result.append(list(map(float, line.split(','))))
print(result)
#动态绘制
for i in range(len(result)):
pen.color((result[i][3],result[i][4],result[i][5]))
pen.forward(result[i][0])
if result[i][1]:
pen.rt(result[i][2])
else:
pen.lt(result[i][2])
pen.goto(0,0)

if __name__ == '__main__':
main()


五、if name == ‘main‘:

main()

很多新手刚开始学习python的时候经常会看到python 中name = \’main\’ 这样的代码,可能很多新手一开始学习的时候都比较疑惑,python 中name = ‘main’ 的作用,到底干嘛的?

有句话经典的概括了这段代码的意义:

“Make a script both importable and executable”

意思就是说让你写的脚本模块既可以导入到别的模块中用,另外该模块自己也可执行。

这句话,可能一开始听的还不是很懂。下面举例说明:

先写一个模块:

?

1

2

3

4

5

module.py

def main():

print “we are in %s”%name

if name == ‘main‘:

main()

这个函数定义了一个main函数,我们执行一下该py文件发现结果是打印出”we are in main“,说明我们的if语句中的内容被执行了,调用了main():

但是如果我们从另我一个模块导入该模块,并调用一次main()函数会是怎样的结果呢?

?

1

2

3

anothermodle.py

from module import main

main()

其执行的结果是:we are in module

但是没有显示”we are in main“,也就是说模块name = ‘main’ 下面的函数没有执行。

这样既可以让“模块”文件运行,也可以被其他模块引入,而且不会执行函数2次
9c43
。这才是关键。!!!


总结一下:

如果我们是直接执行某个.py文件的时候,该文件中那么”name == ‘main‘“是True,但是我们如果从另外一个.py文件通过import导入该文件的时候,这时name的值就是我们这个py文件的名字而不是main

这个功能还有一个用处:调试代码的时候,在”if name == ‘main‘“中加入一些我们的调试代码,我们可以让外部模块调用的时候不执行我们的调试代码,但是如果我们想排查问题的时候,直接执行该模块文件,调试代码能够正常运行
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  python