集成电路技术分享

 找回密码
 我要注册

QQ登录

只需一步,快速开始

搜索
查看: 2131|回复: 2

给深度学习入门者的Python快速教程基础篇之十六

[复制链接]
4798345 发表于 2017-5-22 18:28:03 | 显示全部楼层 |阅读模式
函数、生成器和类

还是从几个例子看起:
def say_hello():
print('Hello!')

def greetings(x='Good morning!'):
print(x)

say_hello() # Hello!
greetings() # Good morning!
greetings("What's up!") # What's up!
a = greetings() # 返回值是None

def create_a_list(x, y=2, z=3): # 默认参数项必须放后面
return [x, y, z]

b = create_a_list(1) # [1, 2, 3]
c = create_a_list(3, 3) # [3, 3, 3]
d = create_a_list(6, 7, 8) # [6, 7, 8]

def traverse_args(*args):
for arg in args:
print(arg)

traverse_args(1, 2, 3) # 依次打印1, 2, 3
traverse_args('A', 'B', 'C', 'D') # 依次打印A, B, C, D

def traverse_kargs(**kwargs):
for k, v in kwargs.items():
print(k, v)

traverse_kargs(x=3, y=4, z=5) # 依次打印('x', 3), ('y', 4), ('z', 5)
traverse_kargs(fighter1='Fedor', fighter2='Randleman')

def foo(x, y, *args, **kwargs):
print(x, y)
print(args)
print(kwargs)

# 第一个pring输出(1, 2)
# 第二个print输出(3, 4, 5)
# 第三个print输出{'a': 3, 'b': 'bar'}
foo(1, 2, 3, 4, 5, a=6, b='bar')

其实和很多语言差不多,括号里面定义参数,参数可以有默认值,且默认值不能在无默认值参数之前。Python中的返回值用return定义,如果没有定义返回值,默认返回值是None。参数的定义可以非常灵活,可以有定义好的固定参数,也可以有可变长的参数(args: arguments)和关键字参数(kargs: keyword arguments)。如果要把这些参数都混用,则固定参数在最前,关键字参数在最后。

Python中万物皆对象,所以一些情况下函数也可以当成一个变量似的使用。比如前面小节中提到的用字典代替switch-case的用法,有的时候我们要执行的不是通过条件判断得到对应的变量,而是执行某个动作,比如有个小机器人在坐标(0, 0)处,我们用不同的动作控制小机器人移动:
moves = ['up', 'left', 'down', 'right']

coord = [0, 0]

for move in moves:
if move == 'up': # 向上,纵坐标+1
coord[1] += 1
elif move == 'down': # 向下,纵坐标-1
coord[1] -= 1
elif move == 'left': # 向左,横坐标-1
coord[0] -= 1
elif move == 'right': # 向右,横坐标+1
coord[0] += 1
else:
pass
print(coord)

不同条件下对应的是对坐标这个列表中的值的操作,单纯的从字典取值就办不到了,所以就把函数作为字典的值,然后用这个得到的值执行相应动作:
moves = ['up', 'left', 'down', 'right']

def move_up(x): # 定义向上的操作
x[1] += 1

def move_down(x): # 定义向下的操作
x[1] -= 1

def move_left(x): # 定义向左的操作
x[0] -= 1

def move_right(x): # 定义向右的操作
x[0] += 1

# 动作和执行的函数关联起来,函数作为键对应的值
actions = {
'up': move_up,
'down': move_down,
'left': move_left,
'right': move_right
}

coord = [0, 0]

for move in moves:
actions[move](coord)
print(coord)

把函数作为值取到后,直接加一括号就能使了,这样做之后起码在循环部分看上去很简洁。有点C里边函数指针的意思,只不过更简单。其实这种用法在之前讲排序的时候我们已经见过了,就是operator中的itemgetter。itemgetter(1)得到的是一个可调用对象(callable object),和返回下标为1的元素的函数用起来是一样的:
def get_val_at_pos_1(x):
return x[1]

heros = [
('Superman', 99),
('Batman', 100),
('Joker', 85)
]

sorted_pairs0 = sorted(heros, key=get_val_at_pos_1)
sorted_pairs1 = sorted(heros, key=lambda x: x[1])

print(sorted_pairs0)
print(sorted_pairs1)

在这个例子中我们用到了一种特殊的函数:lambda表达式。Lambda表达式在Python中是一种匿名函数,lambda关键字后面跟输入参数,然后冒号后面是返回值(的表达式),比如上边例子中就是一个取下标1元素的函数。当然,还是那句话,万物皆对象,给lambda表达式取名字也是一点问题没有的:
some_ops = lambda x, y: x + y + x*y + x**y
some_ops(2, 3) # 2 + 3 + 2*3 + 2^3 = 19
fpga_feixiang 发表于 2017-6-2 15:59:58 | 显示全部楼层
字词学习学习,谢谢楼主
zxopenljx 发表于 2022-11-8 10:03:24 | 显示全部楼层
给深度学习入门者的Python快速教程基础篇之十六
您需要登录后才可以回帖 登录 | 我要注册

本版积分规则

关闭

站长推荐上一条 /1 下一条

QQ|小黑屋|手机版|Archiver|fpga论坛|fpga设计论坛 ( 京ICP备20003123号-1 )

GMT+8, 2024-12-24 03:26 , Processed in 0.056976 second(s), 19 queries .

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表