函数
函数是Python中最重要、最基础的代码组织和代码复用方式。
def my_fuction(x,y,z=2)
if z >=1 :
return z * (x+y)
else:
return z / (x+y)
x,y为位置参数,z为关键字参数,关键字参数必须跟在位置参数之后(如果有的话),传参时,可以使用关键字参数向位置参数传参。
my_fuction(2,3)
my_fuction(2,3,5)
my_fuction(x=2,y=3,z=5)
命名空间、作用域和本地函数
函数有两种连接变量的方式:全局 和本地 。全局变量和局部变量的区别在于作用域,全局变量在整个py文件中声明,全局范围内可以使用,局部变量仅在某个函数内部声明,只能在函数内部使用。
在Python中,另一种更贴切的描述变量作用域的名称是命名空间 。
a=10
def func():
b=20
print(a+b)
print(a)
print(b)
In [18]: runfile('D:/ipython/未命名0.py')
30
10
Traceback (most recent call last):
File "D:\ipython\未命名0.py", line 14, in <module>
print(b)
NameError: name 'b' is not defined
在上方所示的代码中,a为全局变量,b为局部变量,b的作用空间是在函数func()内部,当函数执行结束后,命名空间就会被销毁,在函数外调用变量b就报错了。
如果想在函数内部改变全局变量,需要在前面加上global关键字,在执行函数之后,全局变量值也会改变。
a = 10
def func():
global a
a = 20
print(a)
func()
print(a)
In [22]: runfile('D:/ipython/func.py')
10
20
返回多个值
def f():
a = 1
b = 2
c = 3
return a, b, c
a, b, c = f()
return_value = f()
print(a, b, c)
print(return_value)
def f_1():
a = 'Ma Long'
b = 'Zhang Jike'
c = 'Xu xin'
return {'Champion': a, 'Second place': b, 'Third place': c}
Top_three = f_1()
print(Top_three)
In [34]: runfile('D:/ipython/func.py')
1 2 3
(1, 2, 3)
{'Champion': 'Ma Long', 'Second place': 'Zhang Jike', 'Third place': 'Xu xin'}
函数是对象
province=[' Shandong','shanghai','Henan','GUIzhou','LiAoNINg','Beijing##','Guang?dong']
现在有一个列表,存储这一些省份名称,但这些数据格式杂乱,如果想将这些数据变得整齐,需要:去除空格,移除标点符号,调整大小写。如何来实现呢?
import re
def clean_strings(strings):
result = []
for value in strings:
value = value.strip()
value = re.sub('[!#?]', '', value)
value = value.title()
result.append(value)
return result
In [38]: clean_strings(province)
Out[38]:
['Shandong',
'Shanghai',
'Henan',
'Guizhou',
'Liaoning',
'Beijing',
'Guangdong']
import re
def remove_puctuation(value):
return re.sub('#!?', '', value)
clean_ops = [str.strip, remove_puctuation, str.title]
def clean_strings(strings, ops):
result = []
for value in strings:
for op in ops:
value = op(value)
result.append(value)
return result
In [55]: clean_strings(province,clean_ops)
Out[55]:
['Shandong',
'Shanghai',
'Henan',
'Guizhou',
'Liaoning',
'Beijing',
'Guang?Dong']
匿名(Lambda)函数
Python支持匿名或lambda 函数。匿名函数是通过单个语句生成函数的方式,其结果为返回值。匿名函数使用lambda关键字定义,该关键字仅表达“我们声明一个匿名函数”的意思:
def short_function(x):
return x*2
equiv_anon=lambda x:x*2
匿名函数在数据分析中非常方便,代码量小,将它作为参数进行传值,比写一个完整的函数或者将匿名函数赋值给局部变量更好。
def short_function(list,f):
return [f(x) for x in list]
ints=[1,3,5,6,8]
short_function(ints,lambda x : x^2)
柯里化:部分参数应用
通过部分参数应用的方式从已有的函数中衍生出新的函数。
def add_number(a,b):
return a+b
add_five=lambda b: add_number(5,b)
错误和异常处理
为保证程序稳定运行,需要合理的处理错误和异常。
In [63]: float('1.23')
Out[63]: 1.23
In [64]: float('x')
Traceback (most recent call last):
File "C:\Users\lenovo\AppData\Local\Temp/ipykernel_7332/2200206437.py", line 1, in <module>
float('x')
ValueError: could not convert string to float: 'x'
如果想在float函数运行失败时返回参数,可以通过将float函数写入一个try/except代码段实现:
def attempt_float(x):
try:
return float(x)
except (TypeError,ValueError):
return x
finally:
print(Done!)
In [82]: attempt_float(3.5)
Done
Out[82]: 3.5
In [83]: attempt_float((1,2))
Done
Out[83]: (1, 2)
Python for Data Analysis by Wes McKinney(O’Reilly).Copyright 2017 Wes McKinney,978-1-491-95766-0.
|