【Python编程与数据分析】函数
函数
- 函数(functions): 一段可被复用的代码
- 函数在被调用(“called” or “invoked”)前不会被运行
- 函数的构成:
• 有一个函数名(name)
• 有0个或多个参数(parameters)
• 有一个文档字符串(docstring) (推荐但不必须)
• 有一个函数体(body)
• 返回(returns) something or None
如何写/调用函数
变量作用域 (scope)
- 实参(actual parameter)的值 在函数被调用时与形参(formal parameter) 绑定
- 进入新的函数时创建一个作用域(scope/frame/environment)
- 作用域(scope) 是名称和对象的映射(类似字典)
如果函数没有return
- 如果没有return, Python 返回 None
- None 表示没有值
把函数做为参数
1.实参可以传入任意类型,包括函数
def func_a():
print('inside func_a')
def func_b(y):
print('inside func_b')
return y
def func_c(z):
print('inside func_c')
return z()
print(func_a()) # 调用func_a, 没有参数
print(5 + func_b(2)) # 调用func _b, 有一个参数
print(func_c(func_a)) # 调用func_c,有一个函数类型的参数
# result:
inside func_a
None
inside func_b
7
inside func_c
inside func_a
None
作用域的例子
- 在函数内,可以获取外部定义的变量
- 在函数内,不可以修改外部定义的变量– 可以使用全局变量, 但不推荐
def h(y):
x +=1 # unboundLocalError:从全局作用域中获取的x不能在函数体内修改
x=5
h(x)
print(x)
全局变量
1.global 关键字
2.函数内声明变量是全局变量,才能在调用函数后使全局变量得到修改
x = 1
def change_global():
global x # 去掉global x后,报错
x = x + 1
change_global()
x # 2
给函数编写文档
- 用注释:#
- 独立文档字符串(docstring)
- def语句后面的字符串
def square(x):
'Calculates the square of the number x.'
return x * x
- 访问文档字符串时
- __doc__是一个魔法属性
>>> square.__doc__
'Calculates the square of the number x.'
函数参数
- 之前:按照参数位置传入参数(顺序很重要)
- 按照关键字
def hello_1(greeting, name):
print('{}, {}!'.format(greeting, name))
>>> hello_1(greeting='Hello', name='world’)
# Hello, world!
# 按照关键字传参时,参数的顺序无关紧要。
>>> hello_1(name='world', greeting='Hello’)
# Hello, world!
关键字参数
- 关键字参数可以在函数定义时赋默认值
def hello_3(greeting='Hello', name='world’):
print('{}, {}!'.format(greeting, name))
# 调用函数时可以不传入任何参数
>>> hello_3()
# Hello, world!
# 可以只传入部分参数(此时按照传入顺序传参)
>>> hello_3('Greetings’)
#Greetings, world!
# 也可全部传入
>>> hello_3('Greetings', 'universe’)
#Greetings, universe!
收集参数
- 使用 * 号收集参数,调用时可以传入多个参数
def print_params(*params):
print(params)
print_params(1, 2, 3) # (1, 2, 3)
- 收集余下的位置参数
def print_params_2(title, *params):
print(title)
print(params)
# 调用时传入多个参数
>>> print_params_2('Params:', 1, 2, 3)
# Params:
#(1, 2, 3) # 收集的参数存在元组里
- *号不能收集关键字参数, **号能
def print_params_3(**params):
print(params)
>>> print_params_3(x=1, y=2, z=3)
#{'z': 3, 'x': 1, 'y': 2}
- *号和**号还能在调用函数时分配参数
def add(x, y):
return x + y
params = (1, 2) # 元组中有要相加的数
>>> add(*params) # 用*号把元组的1和2分配给参数x和y,可分配可迭代对象
#3
5.混合使用
递归
- 递归:函数调用自身
def recursion():
return recursion() # 无穷递归,理论上永不结束,会引发异常报错
recursion()
- 合理的递归:把问题按照递归思想拆分
- 基线条件:满足条件时函数直接返回一个值
- 递归条件:包含一个或多个调用,解决问题的一部分
Python内置函数
内置函数
1.callable(object)
- 检查一个对象是否可调用
- 函数、方法、lambda 表达式、 类以及实现了 call 方法的类实例, 都返回 true
class C:
def printf(self):
print('This is class C!')
objC = C()
callable(C) # True 调用类会产生对应的类实例
callable(C.printf) # True
callable(objC) # False 类C没实现__call__()方法
callable(objC.printf) # True
# 添加方法
def __call__(self):
print('Put this method to class!')
2.bool()
- bool(x) -> bool
- 何时返回False?
bool(),无参数时
x为0、''、False、None、空元组/列表/字典
3.all(iterable, /): Return True if bool(x) is True for all values x in the iterable.
4.any(iterable, /): Return True if bool(x) is True for any x in the iterable.
5.bin(number, /): Return the binary representation of an integer.
6.globals(): 返回全局作用域内 变量名/值 对的字典 (本体、非拷贝) - globals 可以修改
- locals()
- 返回字典,包含当前位置作用域中的变量名:值
- 在全局处调用locals(),作用等同于globals()
OS.PATH