第六章 函数式编程
这部分个人认为作用域和命名空间那块讲的不是特别清楚。
文章目录
1.阅读以下代码,解释[eval(‘lric_’+str(x)+’()’) for x in range(1,6)]命令含义。
>>> def lric_1():
pass
>>> def lric_2():
return
>>> def lric_3():
return None
>>> def lric_4():
return 4
>>> def lric_5():
return 1,2,3,4,"5"
>>> [eval('lric_'+str(x)+'()') for x in range(1,6)]
#输出结果
>>>[None, None, None, 4, (1, 2, 3, 4, '5')]
分两段来看。
eval('lric_'+str(x)+'()')
是把字符串当作命令来执行。
for x in range(1,6)
遍历1-5.那么结合起来看的话就是:调用前面定义的函数,并输出结果。
2.什么是docstring?它有什么样的特点和作用?
即放在函数定义开头的字符串。
def ric():
'''just a function'''
print('handsome')
#调用
>>> ric()
handsome
>>> help(ric)
Help on function ric in module __main__:
ric()
just a function #在帮助文档中显示。
>>>
>>> ric.__doc__
'just a function'
>>> ric.__doc__='JUST A FUNCTION' #修改
>>> ric.__doc__
'JUST A FUNCTION'
>>> help(ric)
Help on function ric in module __main__:
ric()
JUST A FUNCTION
>>>
特点:可以被直接修改
作用:其在help文档中可以显示函数定义时候的第一行字符串。
3.函数参数相关问题。
(1)位置参数和默认参数
在定义函数时没有被定义的参数。如以下一个函数:
def sale_car(price,color,brand,is_second_car):
print('price:',price,
'color:',color,
'brand:',brand,
'is_second_car:',is_second_car)
sale_car(1000,'white','Benz',True)
但输入这么多位置参数特别麻烦,加入有N个位置参数呢?这时候需要使用默认参数,默认参数最主要的功能是什么?设定默认值,即在不给出参数值的时候,使用函数定义时候的默认值。
修改如下:把颜色、牌子、是否二手车改成默认值。
def sale_car(price,color='black',brand='BMW',is_second_car=True):
print('price:',price,
'color:',color,
'brand:',brand,
'is_second_car:',is_second_car)
sale_car(2000000)
注意:
使用默认参数时必须是不可变对象!否则在重复调用时候会出现以下现象。因为他们共享的是同一个列表(L)对象,只是每调用一次就往该列表中增加了一个元素。
def ric(L=[]):
L.append('a')
print(L)
#输出
>>> ric()
['a']
>>> ric()
['a', 'a']
(2)任意参数
引入 :编写一个函数用于计算立方和,代码如下:
>>> def calc(numbers):
sum=0
for x in numbers:
sum=sum+x**3
return sum
#调用calc
>>> calc([1,2,3])
36
但是,这样定义的函数,在输入参数的时候必须要组装成一个list或者tuple才行,那么如何简化呢?*号了解一下!。修改如下:
>>>def calc(*numbers):
sum=0
for x in numbers:
sum=sum+x**3
return sum
#调用,随意输入
>>> calc(1,2,3)
36
>>>
**(3)关键字参数 kw
类型是tuple。
>>>def food_analysis(name,age,**kw):
print('name:',name,'age:',age,'other:',kw)
#调用
>>>food_analysis('ric',education_background='scholar',research_field='electrochemical')
#输出
>>>name: ric age: 23 other; {'education_background': 'scholar', 'research_field': 'electrochemical'}