首页 > 技术文章 > 函数(5)

MUMO 2016-07-27 15:19 原文

第5章  自动义功能单元

声明函数,使用缩进语句表示语句属于函数体
def <函数名>(参数列表):
    <函数语句>
    return <返回值>

return后没有返回值和没有return语句的函数都会返回None值

例:求一个元组中所有数之和的功能
def tpl_sum(T):
    result=0
    for i in T
        result+=i
    return result

定义参数
1、默认值参数:解决既可以向函数传递参数,又可以不传递参数的问题:使用默认值参数
形式:
def <函数名> (参数1,参数2,...,参数3=默认值,参数4=默认值...):
    <语句>
如果参数列表中既有无默认值参数,又包含有默认值参数,必须先声明无默认值参数,后声明有默认值参数
2、可变数量参数:放在参数列表中的所有参数之后
形式1:
def <函数名>(参数1,参数2,...,*参数3):
    <语句>
*参数3,使用元组收集参数,调用时,只能收集不定数量的位置参数,不能收集关键字参数
形式2:
def <函数名>(参数1,参数2,...,**参数3):
**参数3,使用字典收集关键字参数
收集字典的方式为函数中使用大量的默认值提供了方便,不用把大量的默认值全放在函数声明的参数中,而是把它放入程序之中
例:
def cube(name,**nature):
    all_nature={'x':1,'y':2,'z':1,'color':'white','weight':1}
    all_nature.update(nature)
    print(name,"立方体的属性:")
    print('体积:',all_nature['x']*all_nature['y']*all_nature['z'])
    print('颜色:',all_nature['color'])
    print('重量:',all_nature['weight')

cube('first')
cube('second',y=3,color='red')
cube('third',z=2,color='green',weight=10)

参数传递
(1)、按照声明函数时参数的位置顺序进行传递的,即位置参数,位置参数优先使用
(2)、按照参数名传递值    hello(name="Jonson"),用于多个参数都具有默认值,仅向一个其中部分参数传值的情况
调用函数提供参数时,位置参数要位于关键字参数之前,且不能对同一个参数重复传参;
#调用函数时,无默认值参数使用位置传参,有默认值参数使用关键字传参
(3)、拆解序列
拆解元组,符号:*,提供位置参数
拆解字典,符号:**,提供关键字参数
例:
def mysum(a,b):
    return a+b

print('拆解元组调用:')
print(mysum(*(3,4)))
print('拆解字典调用:')
print(mysum(**{'a':3,'b':4}))
>>>
拆解元组调用:
7
拆解字典调用:
7
(4)、在函数调用时,若提供的是不可变参数,那么在函数内部对其修改时,在函数外部其值是不变的;若提供可变参数,则在函数内部对它修改时,在函数外部其值也会改变
不可变的元素:整数、浮点数、字符串、元组,改变一个指向整数变量的值,直接在内存中创建一个新的整数值,然后将变量引用与其绑定
可变的元素:列表、字典
注:在使用空列表作为默认参数时,正确定义方式
def myfun(lst=None)
    lst=[] if lst is None else lst
    lst.append('abc')
    print(lst)
错误定义方式:
def myfun(lst=[])
    lst.append('abc')
    print(lst)

变量作用域
内置作用域:Python预先定义的
全局作用域:所编写的整个程序
局部作用域:某个函数内部范围

每次执行函数,都会创建一个新的命名空间,不在相同作用域内的变量名、参数名可以重复
局部作用域内可以引用全局作用域内的变量(print(a)是可以的),但不可以修改它
在函数中引用全局变量并进行操作:
1、将全局作用域中的变量作为函数的参数引用(传参适合可变元素)
2、在函数中的变量名前使用global关键字
例:
def myfun():
    global a
    a=0
    a+=3
    print('函数内a:',a)

a='external'
print('全局作用域a:',a)
myfun()
print('全局作用域a:',a)
>>>
全局作用域a:external
函数内a:3
全局作用域a:3

匿名函数(lambda)
使用范围:简单匿名函数;不复用的函数。比如,在某个函数中需要一个重复使用的表达式,就可以使用lambda来定义一个匿名函数多次调用
形式:
lambda params:expr
params:参数,
expr:返回值的表达式,可以是元组,可以调用其他函数
例:
import math
s=lambda x1,y1,x2,y2:math.sqrt((x1-x2)**2+(y1-y2)**2)
s(1,1,0,0)
>>>>
1.4141....

Python常用内建函数
help(abs)  #显示abs函数的帮助信息
bin(20)   #十进制数20转换为二进制字符串形式
hex(20)   #十进制数20转换为十六进制字符串形式
oct(20)  #十进制数20转换为八进制字符串形式
callable(abs)  #检查abs是否可调用
chr(97)    #ascii码为97转为字符
ord('k')   #求字符的ascii码
alst=[0,1,2,3,4]
list(filter(lambda x:x%2,alst))  #去除列表alst中的偶数
list(map(lambda x:2*x,alst))   #将列表中的alst元素都扩大两倍
isinstance('abc',str)     #检查'abc'是否是字符串类型

推荐阅读