函数

一,定义

  对代码块和功能的封装。

形式为:def 函数名():

      函数体

      return(会返回结果,可有可无)

注意,return后面的函数会不再执行。

关于返回值:
如果return什么都不写 或者 ⼲脆不写return .那么返回的就是None
如果return后⾯写了⼀个值. 则调⽤者可以接收⼀个结果
如果return后⾯写了多个结果, 则调⽤者可以接收⼀个tuple, 调⽤者可以直接解构成
多个变量

二,参数

参数大致分为位置参数>*args(输出为元组)>默认值参数>**kwargs(输出为字典)(这是分布顺序不可打乱)。

  • 形参,在函数声明的位置。(变量)1,位置参数;2,默认值参数;3,动态参数
  • 实参,在函数调用的时候给函数的形参传递的信息。(具体的值)1,位置参数,记住名字;2,关键字参数,记住名字;3,混合参数,先位置后关键。
  • 传参,把实参的值交给形参的过程  
  • 动参,分为*args(位置参数的动态参数)与**kwargs(关键字参数的动态参数)。

位置参数,关键字参数,

  1. 位置参数,按照位置来进行赋值。
    1 def yue(chat, address, age):
    2  print("拿出⼿机")
    3  print("打开"+chat)
    4  print("找个"+address+"附近漂亮的"+str(age)+"岁妹⼦")
    5  print("约不约")
  2. 默认值参数
    1 def stu_info(name, age, sex='男'):
    2  print("录⼊学⽣信息")
    3  print(name, age, sex)
    4  print("录⼊完毕")
    5 stu_info("张强强", 18)

    某些参数可以使用默认值。

  3. 打散

  输入列表时,可以将打散成一个一个的进行输入。此方法对于列表,元组,字符串都可以使用。

1 def fun(*args):
2  print(args)
3 lst = [1, 4, 7]
4 fun(lst[0], lst[1], lst[2])
5 fun(*lst) # 可以使⽤*把⼀个列表按顺序打散
6 s = "⾂妾做不到"
7 fun(*s) # 字符串也可以打散, (可迭代对象)

  对于字典的打算需要另外方法。

1 def fun(**kwargs):
2  print(kwargs)
3 dic = {'a':1, 'b':2}
4 fun(**dic)

  4.函数的注释(又称为文件注释)

方法是多行注释内进行回车。

1 def chi(food, drink):
2  """
3  这⾥是函数的注释, 先写⼀下当前这个函数是⼲什么的, ⽐如我这个函数就是⼀个吃
4  :param :param food: 参数food是什么意思
5  :param :param drink: 参数drink是什么意思
6  :return :return: 返回的是什么东东
7  """
8  print(food, drink)
9  return "very good"

 三,函数名

  函数名与前面学习的变量是差不多的。比如,不能以数字开头等。

  应用:

  • 内存地址
    1 def func():
    2  print("呵呵")
    3 print(func)
    4 结果:
    5 <function func at 0x1101e4ea0>
  • 函数名可以赋值给其他变量
    1 def func():
    2  print("呵呵")
    3 print(func)
    4 a = func # 把函数当成⼀个变量赋值给另⼀个变量
    5 a() # 函数调⽤ func()
  • 函数名可以作为容器
     1 print("呵呵")
     2 def func2():
     3  print("呵呵")
     4 def func3():
     5  print("呵呵")
     6 def func4():
     7  print("呵呵")
     8 lst = [func1, func2, func3]
     9 for i in lst:
    10  i()
  • 函数名可以作为函数的参数
    1 def func():
    2  print("吃了么")
    3 def func2(fn):
    4  print("我是func2")
    5  fn() # 执⾏传递过来的fn
    6  print("我是func2")
    7 func2(func) # 把
    函数func当成参数传递给func2的参数fn.
  • 函数名可以作为函数的返回值
    1 def func_1():
    2  print("这⾥是函数1")
    3  def func_2():
    4  print("这⾥是函数2")
    5  print("这⾥是函数1")
    6  return func_2
    7 fn = func_1() # 执⾏函数1. 函数1返回的是函数2, 这时fn指向的就是上⾯函数2
    8 fn() # 执⾏上⾯返回的函数

四,闭包

  闭包就是内层函数对外层函数(此外层函数非全局)的变量引用。

1 def func1():
2  name = "alex"
3  def func2():
4  print(name) # 闭包
5  func2()
6 func1()
7 结果:
8 alex

可以使用__closure__来检测函数是不是闭包。返回None就不是闭包。

1 def func1():
2  name = "alex"
3  def func2():
4  print(name) # 闭包
5  func2()
6  print(func2.__closure__) # (<cell at 0x10c2e20a8: str object at
7 0x10c3fc650>,)
8 func1()

闭包的好处,一,可以保护变量名不会被覆盖。二,可以保证变量常驻于内存,可以大大增加函数的运行速度。

 

posted on 2023-11-20 23:16  我才是最帅的那个男人  阅读(46)  评论(0)    收藏  举报

导航