Python3.x 函数

来源:互联网 发布:工商网络监管 编辑:程序博客网 时间:2024/05/23 16:09

#python函数:内建函数(如print())和自定义函数#自定义一个函数,遵循如下规则:#1.函数代码块以def关键词开头,后接函数标识符名称和圆括号()#2.任何传入参数和自变量必须放在圆括号中间,圆括号之间可以用于定义参数#3.函数第一行语句可以选择性地使用文档字符串---用于存放函数说明#4.函数内容以冒号起始,并缩进#5.return[表达式]结束函数,选择性地返回一个值给调用方。不带表达式的return 相当于返回None#语法:#def 函数名(参数列表):#   函数体#默认情况下,参数值和参数名称是按函数声明中定义的顺序匹配起来的。#实例:#使用函数输出hello worlddef hello():    print("hello world!")hello()#结果hello world!#更复杂点的应用,函数中带上参数变量:def area(width, height):    return width * heightdef print_welcome(name):    print("Welcome", name)print_welcome("Runoob")w = 4h = 5print("width = ", w, " height = ", h, " area = ", area(w, h))#结果Welcome Runoobwidth =  4  height =  5  area =  20#函数调用:定义一个函数:给了函数一个名称,指定函数里包含的参数和代码块结构#该函数基本结构完成后,可通过另一个函数调用执行,也可直接从Python命令提示符执行#如下实例调用了printme()函数#定义函数def printme(str):    "打印任何传入的字符串"    print(str);    return;#调用函数printme("我要调用用户自定义函数!")printme("再次调用同一函数")#结果我要调用用户自定义函数!再次调用同一函数#参数传递#在python中,类型属于对象,变量是没有类型的:#a = [1,2,3]#a = "Runoob"#以上代码中,[1,2,3]是List类型,"Runoob"是String类型,而变量a是没有类型,它仅仅是一个对象的引用(一个指针),#可以是List类型对象,也可以指向String类型对象#可更改(mutable)与不可更改(immutable)对象#在python中,strings,tuples和numbers是不可更改对象,而list,dict等则是可修改的对象。#1.不可变类型:变量赋值a=5后再赋值a=10,这里实际是新生成一个int值对象10,再让a指向它,而5被丢弃,不是改变a的值,相当于新生成了a。#2.可变类型:变量赋值la=[1,2,3,4]后再赋值la[2]=5则是将list la的第三个元素值更改,本身la没有动,只是其内部的一部分值被修改了。#python函数的参数传递:#1.不可变类型:类似C++的值传递,如整数,字符串,元组。如fun(a),传递的只是a的值,没有影响a对象本身。比如在fun(a)内部修改a的值,只是#修改另一个复制的对象,不会影响a本身#2.可变类型:类似C++的引用传递,如列表,字典。如fun(la),则是将la真正的传过去,修改fun外部的la也会受到影响#python中一切都是对象,严格意义我们不能说值传递还是引用传递,我们应该说传不可变对象和传可变对象#python传不可变对象实例:def ChangeInt(a):    a = 10b = 2ChangeInt(b)print(b)#结果2#实例中有int对象2,指向它的变量是b,在传递给ChangeInt函数时,按传值的方式赋值了变量b,a和b都指向了同一个int对象那个,在a=10时,则新生成一个int#值对象10,并让a指向它#传可变对象实例:#可变对象在函数里修改了参数,那么调用这个函数的函数里,原始的参数也被改变了。例如:#可写函数说明def changeme(mylist):    "修改传入的列表"    mylist.append([1, 2, 3, 4]);    print("函数内取值:", mylist)    return#调用changeme函数mylist = [10, 20, 30];changeme(mylist);print("函数外取值: ", mylist)#结果函数内取值: [10, 20, 30, [1, 2, 3, 4]]函数外取值:  [10, 20, 30, [1, 2, 3, 4]]#传入函数的和在末尾添加新内容的对象用的是同一个引用#参数#以下是调用函数时可使用的正式参数类型:#必需参数#关键字参数#默认参数#不定长参数#必需参数#必需参数须以正确的顺序传入函数。调用时的数量必须和声明时的一样。#调用printme()#函数,你必须传入一个参数,不然会出现语法错误:# !/usr/bin/python3# 可写函数说明def printme(str):    "打印任何传入的字符串"    print(str);    return;# 调用printme函数printme();结果:TypeError: printme() missing 1 required positional argument: 'str'#关键字参数#关键字参数和函数调用关系紧密,函数调用使用关键字参数来确定传入的参数值。#使用关键字参数允许函数调用时参数的顺序与声明时不一致,因为#Python#解释器能够用参数名匹配参数值。#以下实例在函数#printme()#调用时使用参数名:# !/usr/bin/python3# 可写函数说明def printme(str):    "打印任何传入的字符串"    print(str);    return;# 调用printme函数printme(str="菜鸟教程");#结果:菜鸟教程#以下实例中演示了函数参数的使用不需要使用指定顺序:# !/usr/bin/python3# 可写函数说明def printinfo(name, age):    "打印任何传入的字符串"    print("名字: ", name);    print("年龄: ", age);    return;# 调用printinfo函数printinfo(age=50, name="runoob");#结果:名字:  runoob年龄:  50#默认参数#调用函数时,如果没有传递参数,则会使用默认参数。以下实例中如果没有传入#age#参数,则使用默认值:# !/usr/bin/python3# 可写函数说明def printinfo(name, age=35):    "打印任何传入的字符串"    print("名字: ", name);    print("年龄: ", age);    return;# 调用printinfo函数printinfo(age=50, name="runoob");print("------------------------")printinfo(name="runoob");#结果名字:  runoob年龄:  50------------------------名字:  runoob年龄:  35#不定长参数#你可能需要一个函数能处理比当初声明时更多的参数。这些参数叫做不定长参数,和上述2种参数不同,声明时不会命名。基本语法如下:#def functionname([formal_args, ] * var_args_tuple):#    "函数_文档字符串"#    function_suite#    return [expression]#加了星号( * )的变量名会存放所有未命名的变量参数。如果在函数调用时没有指定参数,它就是一个空元组。我们也可以不向函数传递未命名的变量。如下实例:# !/usr/bin/python3# 可写函数说明def printinfo(arg1, *vartuple):    "打印任何传入的参数"    print("输出: ")    print(arg1)    for var in vartuple:        print(var)    return;# 调用printinfo 函数printinfo(10);printinfo(70, 60, 50);#结果输出:10输出:706050##匿名函数#python#使用lambda 来创建匿名函数。#所谓匿名,意即不再使用def 语句这样标准的形式定义一个函数。#lambda 只是一个表达式,函数体比def 简单很多。#lambda的主体是一个表达式,而不是一个代码块。仅仅能在lambda表达式中封装有限的逻辑进去。#lambda 函数拥有自己的命名空间,且不能访问自己参数列表之外或全局命名空间里的参数。#虽然lambda函数看起来只能写一行,却不等同于C或C + +的内联函数,后者的目的是调用小函数时不占用栈内存从而增加运行效率。#语法#lambda 函数的语法只包含一个语句,如下:#lambda [arg1[, arg2, .....argn]]: expression#如下实例:# !/usr/bin/python3# 可写函数说明sum = lambda arg1, arg2: arg1 + arg2;# 调用sum函数print("相加后的值为 : ", sum(10, 20))print("相加后的值为 : ", sum(20, 20))#结果相加后的值为 :  30相加后的值为 :  40###return语句#return [表达式] 语句用于退出函数,选择性地向调用方返回一个表达式。不带参数值的return语句返回None。之前的例子都没有示范如何返回数值,以下实例演示了 return 语句的用法:#!/usr/bin/python3# 可写函数说明def sum( arg1, arg2 ):   # 返回2个参数的和."   total = arg1 + arg2   print ("函数内 : ", total)   return total;# 调用sum函数total = sum( 10, 20 );print ("函数外 : ", total)#结果函数内 :  30函数外 :  30###变量作用域#Python中,程序的变量并不是在哪个位置都可以访问的,访问权限决定于这个变量是在哪里赋值的。#变量的作用域决定了在哪一部分程序可以访问哪个特定的变量名称。Python的作用域一共有4种,分别是:#L (Local) 局部作用域#E (Enclosing) 闭包函数外的函数中#G (Global) 全局作用域#B (Built - in) 内建作用域#以L – > E – > G – > B的规则查找,即:在局部找不到,便会去局部外的局部找(例如闭包),再找不到就会去全局找,再者去内建中找。#x = int(2.9)  # 内建作用域#g_count = 0  # 全局作用域#def outer():#    o_count = 1  # 闭包函数外的函数中#   def inner():#        i_count = 2  # 局部作用域#Python 中只有模块(module),类(class)以及函数(def、lambda)才会引入新的作用域,其它的代码块(如 if/elif/else/、try/except、for/while等)是不会引入新的作用域的,#也就是说这这些语句内定义的变量,外部也可以访问,如下代码:#>>> if True:#...  msg = 'I am from Runoob'...#>>> msg#'I am from Runoob'##实例中 msg 变量定义在 if 语句块中,但外部还是可以访问的。#如果将 msg 定义在函数中,则它就是局部变量,外部不能访问:# >>>#>>> def test():#...     msg_inner = 'I am from Runoob'#...#>>> msg_inner#Traceback (most recent call last):#  File "<stdin>", line 1, in <module>#NameError: name 'msg_inner' is not defined#>>>#从报错的信息上看,说明了 msg_inner 未定义,无法使用,因为它是局部变量,只有在函数内可以使用。#全局变量和局部变量#定义在函数内部的变量拥有一个局部作用域,定义在函数外的拥有全局作用域。#局部变量只能在其被声明的函数内部访问,而全局变量可以在整个程序范围内访问。调用函数时,所有在函数内声明的变量名称都将被加入到作用域中。如下实例:#!/usr/bin/python3total = 0; # 这是一个全局变量# 可写函数说明def sum( arg1, arg2 ):    #返回2个参数的和."    total = arg1 + arg2; # total在这里是局部变量.    print ("函数内是局部变量 : ", total)    return total;#调用sum函数sum( 10, 20 );print ("函数外是全局变量 : ", total)#结果函数内是局部变量 :  30函数外是全局变量 :  0#global 和 nonlocal关键字#当内部作用域想修改外部作用域的变量时,就要用到global和nonlocal关键字了。#以下实例修改全局变量 num:#!/usr/bin/python3num = 1def fun1():    global num  # 需要使用 global 关键字声明    print(num)    num = 123    print(num)fun1()#结果1123#如果要修改嵌套作用域(enclosing#作用域,外层非全局作用域)中的变量则需要#nonlocal 关键字了,如下实例:# !/usr/bin/python3def outer():    num = 10    def inner():        nonlocal num  # nonlocal关键字声明        num = 100        print(num)    inner()    print(num)outer()#结果100100#另外有一种特殊情况,假设下面这段代码被运行:# !/usr/bin/python3a = 10def test():    a = a + 1    print(a)test()#以上程序执行,报错信息如下:#Traceback (most recent call last):#  File "test.py", line 7, in <module>#    test()#  File "test.py", line 5, in test#    a = a + 1#UnboundLocalError: local variable 'a' referenced before assignment#错误信息为局部作用域引用错误,因为 test 函数中的 a 使用的是局部,未定义,无法修改。


参考网页

原创粉丝点击