函数

  • 默认输出并换行: print("string")
  • 指定输出结束符: print("string", end="__")

自定义函数

def func_name():
...
return None
`
  • 形式参数(形参)
  • 传递参数/实际参数(传参/实参)
  • 返回值(注意:返回值得内存地址)
  • 函数嵌套调用,必须顺序正确
  • 位置参数:必须传值,且有几个参数就传几个传值
  • 默认参数:没有传值,使用默认参数
  • 形参:
    • *args: 元祖
    • **kargs: 字典
func(1,2,3, a='a',b='b',c='c')
args = (1,2,3)
kargs = {a:'a',b:'b',c:'c'}
li = [1,2,3]
func(*li) # 实参角度,序列按照顺序打散
def func(*args): # 形参角度,给变量加上*,就是组合所有传来的值
'''
# 这个函数实现了什么功能
# 参数1:
# 参数2:
# :return: 是字符串或者列表的长度
# '''
  • 形参:
    • 位置参数 : 必须传
    • *args :可以接收任意多个位置参数
    • 默认参数 : 可以不传
    • **kwargs : 可以接收多个关键字参数
  • 实参:按照位置传参,按照关键字传参
  • 默认函数参数的值是一个可变数据类型,那么每一次调用函数的时候,如果不传值就公用这个数据类型的资源
def fun(k, l={}):
l[k] = 'v'
print(l)
fun(1) # {1:'v'}
fun(2) # {1:'v',2:'v'}
fun(3) # {1:'v',2:'v',3:'v'}

命名空间和作用域

  • 内置命名空间
    • Python解释器启动就可以使用的名字存储在内置命名空间中
    • 内置的名字在启动解释器的时候被加载进内存里
      • print()
      • input()
  • 全局命名空间
    • 在程序从上到下被执行的过程中一次加载进内存的
    • 放置了我们设置的所有变量名和函数名
  • 局部命名空间
    • 函数体内定义的名字
    • 调用函数的时候,才会产生这个名称空间,随着函数执行的结束,这个命名空间就消失
  • 在局部:可以使用全局、内置命名空间中的名字
  • 在全局:可以使用内置命名空间中的名字,但是不能用局部中使用
  • 在内置:不能使用局部和全局的名字的
  • globals()
  • locals()
  • global 关键字
局部调用:局部命名空间 < 全局命名空间 < 内置命名空间
全局调用:全局命名空间 < 内置命名空间

nonlocal

只能用于局部变量,找上层中离当前函数最近一层的局部变量
声明了 nonlocal 的内部函数的变量修改会影响到里当前函数最近一层的局部变量
对全局无效
对局部也是对最近一层有影响

return

函数里没有 return, 会默认返回一个 None
如果return多个对象,那么 Python 会把多个对象封装成一个元组作为一个一个整体结果输出

作用域

LEGB: Local < Enclosing < Global < Builtin

内置函数 Buil-in functions

不需要导入模块就可以使用的函数
  • abs()
  • all([1,2,3,4]) 所有元素都是真的时候返回 True
    • None => False
    • "" => False
    • [] => False
    • () => False
    • {} => False
  • any(['',1,{}]) 只有有一个真的则返回 True
  • ascii() 返回字符串格式
    • ascii(8) == int.__repr__()
  • bin(10) # '0b1010'
  • bool()
  • bytearray("微明", encoding="utf-8") # 返回字节数组 b'\xe5\xbe\xae\xe6\x98\x8e'
  • bytes("微明", encoding="utf-8") # 返回字节 b'\xe5\xbe\xae\xe6\x98\x8e'
  • callable(变量名) 变量是否可执行函数True
  • chr(99) # 'c'
    • import random
    • random.randint(1,99) # 验证码例子
  • ord('c') # 99
  • classmethod()
  • compile(filename) 编译
    • filename文件的内容字符串编译成python语言
  • complex()
  • delattr() 反射时使用
  • dict()
  • dir() 返回列表的key
  • divmod()
  • enumerate()
    • li = ['alex','eric','lily']
    • for i,item in enumerate(li, 1):print(i,item)
  • eval('6*8')
  • exec()
  • filter(func, list) 过滤元素
  • float()
  • format() == int.format()`
  • frozenset() 不能增加修改set
  • getattr()
  • globals() 当前所有的全局变量
  • hasattr()
  • hash()
  • help()
  • hex()
  • id()
  • input()
  • int()
  • isinstance()
  • issubclass()
  • iter()
  • len()
  • list()
  • locals() 所有的局部变量
  • map()
    • li = map(lambda x:x+100, [11,22,33])
    • print(list(li))
  • max(1,23,33)
  • memoryview()
  • min()
  • next()
  • object()
  • oct()
  • open()
  • pow()
  • print()
  • property()
  • range(0,10) 迭代器,不到10,循环时创建数字
  • repr()
  • reversed()
  • round()
  • set()
  • setattr()
  • slice()
  • sorted()
  • staticmethod()
  • str()
  • sum()
  • super()
  • tuple()
  • type()
  • vars() 返回key:value
  • zip()
  • __import__()

匿名函数-lamda

lambda 参数,参数2 : 返回值表达式 和五个特殊的内置函数可以结合使用

递归函数

在函数中调用自身函数
  • 最大递归深度默认是997/998 —— 是python从内存角度出发做得限制
  • 如果递归次数太多,就不适合使用递归来解决问题
  • 递归的缺点 : 占内存
  • 递归的优点: 会让代码变简单
RecursionError: maximum recursion depth exceeded while calling a Python object 递归的错误,超过了递归的最大深度
Last modified 3yr ago