【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

给函数编写文档

  1. 用注释:#
  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.'

函数参数

  1. 之前:按照参数位置传入参数(顺序很重要)
  2. 按照关键字
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!

关键字参数

  1. 关键字参数可以在函数定义时赋默认值
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!

收集参数

  1. 使用 * 号收集参数,调用时可以传入多个参数
def print_params(*params):
  print(params)
print_params(1, 2, 3) # (1, 2, 3)
  1. 收集余下的位置参数
def print_params_2(title, *params):
  print(title)
  print(params)
# 调用时传入多个参数
>>> print_params_2('Params:', 1, 2, 3)
# Params:
#(1, 2, 3)  # 收集的参数存在元组里
  1. *号不能收集关键字参数, **号能
def print_params_3(**params):
  print(params)
>>> print_params_3(x=1, y=2, z=3)
#{'z': 3, 'x': 1, 'y': 2}
  1. *号和**号还能在调用函数时分配参数
def add(x, y):
  return x + y
params = (1, 2)  # 元组中有要相加的数
>>> add(*params)  # 用*号把元组的1和2分配给参数x和y,可分配可迭代对象
#3

5.混合使用

递归

  1. 递归:函数调用自身
def recursion():
  return recursion() # 无穷递归,理论上永不结束,会引发异常报错
recursion()
  1. 合理的递归:把问题按照递归思想拆分
  • 基线条件:满足条件时函数直接返回一个值
  • 递归条件:包含一个或多个调用,解决问题的一部分

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 可以修改
  1. locals()
  • 返回字典,包含当前位置作用域中的变量名:值
  • 在全局处调用locals(),作用等同于globals()

OS.PATH


posted @ 2022-11-18 10:05  Mothlove  阅读(44)  评论(0编辑  收藏  举报