[关闭]
@danren-aa120 2019-08-20T00:03:15.000000Z 字数 2644 阅读 345

7函数

Python


1) 函数的基本使用
  函数:就是把具有独立功能的代码块组织为一个小模块,在需要的时候调用,实现可重用。
  (1)定义函数:封装
  语法:
  def 函数名():
    函数封装的代码
    ……
  
  一对括号和:号别忘记,函数命名规则同第4节变量的命名。
  (2)调用函数:享受成果
  语法:
   函数名()

  即在当前文件中调用很简单,通过函数名()即可调用;只有调用函数才能让函数执行,函数定义部分不会执行;必须先定义后调用。在实际实现中,调用函数结果的前提是必须在定义函数部分写上了返回值语句

  

  •   如定义封装九九乘法表为一个函数multiple_table(),并调用,之后保存在文件df_01_输出九九乘法表中:
  1. def multiple_table(): # 如果不主动调用函数,函数是不会主动执行的
  2. # 行的变量在循环体外赋值,列的在外层循环体内进行赋值
  3. multi_1 = 1
  4. while multi_1 <= 9:
  5. multi_2 = 1
  6. while multi_2 <= multi_1:
  7. result = multi_1 * multi_2
  8. print("%d * %d = %d" % (multi_2, multi_1, result), end = "\t")
  9. multi_2 += 1
  10. print("")
  11. multi_1 += 1
  12. multiple_table()
  • 如在别的文件程序中调用上面文件中封装好的函数,则:
  1. import df_01_输出九九乘法表
  2. df_01_输出九九乘法表.multiple_table()
  • 函数的注释:用成对出现的三个引号""" 函数注释 """ ,以后函数名出现时,使用ctrl+Q即可查看函数的注释

2)函数的参数和返回值

  • 参数。在函数中,参数当变量使用,把希望函数处理的数据,调用时通过参数变量传递进去,语法如下:
  1. def sum_2_num(num1, num2):
  2. """对两个数字求和"""
  3. result = num1 + num2
  4. print("%d + %d = %d" % (num1,num2,result))
  5. sum_2_num(50, 20)

   上面程序中,定义函数时的num1, num2是形参,调用函数时的50, 20是实参。
   定义函数时,可以给某个参数设定一个默认值,即缺省值,如gl_list.sort(reverse=True)。指定缺省参数的默认值时,应该使用该参数最常见的值作为默认值。函数缺省函数定义如下

  1. def print_info(name, gender=True):
  2. gender_text = "男生"
  3. if not gender:
  4. gender_text = "女生"
  5. print("%s是%s" % (name, gender_text))
  6. print_info("小明") # 可以省去gender该参数值的传递

注意:1 带有默认值的参数在函数定义时必须在括号中的参数列表末尾,def print_info(gender=True, name):是错误的!2 如果有多个缺省参数,调用函数时需要指定参数名,这样解释器才能知道对应关系,如def print_info(name, title="", gender=True): ,调用时应该print_info("小明“, gender=Flase),而不是print_info("小明“, Flase)

   在函数内部,无论参数是何种类型,使用赋值语句对参数进行赋值,函数执行后即释放内存,不会影响到函数外部对参数重新赋值后,外部对参数重新赋值的值的引用;但是函数内部通过操作方法对可变类型参数重新修改数据后,会改变参数外部的值。

  • 多值参数。在函数中,如果一个参数接收的数据元素个数是不确定的,则使用多值参数。有两种多值参数:元组(在元组参数名前增加一个*,一般起名叫args),字典(参数名前增加两个**,一般起名**kwargs)。如def demo(name, *args, **kwargs):。元组和字典的拆包,需要在写调用函数语句时,在元组名前增加一个*,字典名前增加两个**。

   

  • 返回值。只有函数内部使用了返回值,才能在定义函数外部的代码中使用其它变量调用并接收函数的结果。
  1. def sum_2_num(num1, num2):
  2. """对两个数字求和"""
  3. result = num1 + num2
  4. return result
  5. sum_result = sum_2_num(10, 20)
  6. print("计算结果:%d" % sum_result)

   一个函数执行后能返回多个结果。多个结果可以包装到元组中,此时返回的是一个元组,如return(temp, wetness),且小括号也可以省去,如return temp, wetness,但仍旧其实返回的是元组。可以使用多个变量,依次接收函数的返回结果,代码如gl_temp, gl_wetness = measure(),measure()是函数名。

3)函数的嵌套调用
  一个函数内部调用另外一个函数。如:

  1. def wdf1():
  2. print("*" * 50)
  3. def wdf2():
  4. print("-" * 50)
  5. wdf1()
  6. print("+" * 50)
  7. wdf2()

  传递参数的例子:

  1. def print_line(char, times):
  2. """打印单行分割线
  3. :param char: 分割字符
  4. :param times: 重复次数
  5. """
  6. print(char * times)
  7. def print_multilines(i, num, char, times):
  8. """打印多行分割线"""
  9. while i <= num:
  10. print_line(char, times)
  11. i += 1
  12. print_multilines(1, 5, "-", 20)

4)使用模块(工具包)中的函数
  Python中,每一个.py程序文件都是一个模块。看上面第1)点中的最后一个例子。在同一Project下,一个源文件中定义的全局变量和函数,其它文件程序都可直接使用,但要使用import先导入文件名(模块名)。如下:

  1. import df_06_分割线模块
  2. df_06_分割线模块.print_multilines(1, 1, "-", 60) #使用模块中的变量或函数,只需要在模块名后加点,然后输入要使用的模块中的函数或变量
  3. print(df_06_分割线模块. name) # df_06_分割线模块. name表示调用df_06_分割线模块文件中的name变量

5)递归函数
  函数的递归指一个函数在其内部可以调用自己或其它函数。递归是一个编程技巧,在处理不确定的循环条件时格外有用。如遍历整个文件目录的结构。
  定义递归函数,编写时首先必须写出口,即有终止递归的出口语句,应使用如下语句:

  1. if ??:
  2. return
添加新批注
在作者公开此批注前,只有你和作者可见。
回复批注