(七)Python:函数

一、自定义函数

Python中自定义函数的规则:

  • 函数代码块以def开头,后接函数名和():
  • 任何传入参数和自变量必须放在小括号中;
  • 函数的第一行语句可以选择性地使用文档字符串——用于存放函数说明。
  • return [表达式] 结束函数,选择性地返回一个值给调用方。不带表达式的return相当于返回 None。

示例:

def 函数名(参数列表):
    函数体

二、调用函数

      定义了函数之后,就相当于有了一个具有某些功能的代码,想要让这些代码能够执行,需要调用它,调用函数很简单的,通过 函数名() 即可完成调用。

def printString():
    print("人生苦短,我用Python")

#调用函数
printString()

这里写图片描述

三、参数传递

3.1、可更改(mutable)与不可更改(immutable)对象

      在python中,string、tuple和numbers都是不可变类型,list和dict是可变类型。

  • 不可变类型:a=5,再次赋值a=10,实际上是重新生成了一个int类型的对象10,并将a指向10,原先的5将被舍弃。
  • 可变类型:list=[1,2,3,4,5],list[2]=333,这里将list的第三个元素3改为了333,list的指向没有改变,只是它的内部改变了。

在python的参数传递中:

  • 传递不可变类型:仅仅是传递了值,对原对象没有影响。
  • 传递可变类型:传递的是实实切切的原对象,函数对参数的修改会影响原对象。
#传递不可变类型
def change(a):
    a=100
b=0
change(b)
print(b)#输出结果仍然是0,没有改变

#传递可变类型
def change(list):
    list[0]=list[0]+100
list=[1,2,3,4,5]
change(list)
print(list)#list被改变:[101,2,3,4,5]
3.2、参数类型

以下是调用函数时可使用的正式参数类型:

  • 必需参数
  • 关键字参数
  • 默认参数
  • 不定长参数

必需参数:
传递参数时必须与参数的顺序一致,并且传递的数量也要一致。

def printString(str):
    print(str)
#调用有参函数但不传递参数
printString()

这里写图片描述

def add(a,b):
    print(a+b)
#传递参数数量不一致
add(1,2,3)

这里写图片描述

关键字参数:
在必需参数中我们的传递参数要和函数参数的顺序一致,使用关键字参数我们可以做到顺序不一致依旧可以调用,python会自动匹配:

def printValue(str,num):
    print("字符串为:",str)
    print("数字为:",num)

print("Hello Python",100)
#使用关键字参数可以顺序不一致
print(num=100,str="Hello Python")

这里写图片描述

默认参数:
当我们没有传递参数时我们可以使用参数的默认参数。

def add(a,b=100):
    print(a+b)

#只传递一个参数
add(100)#打印结果200

注意:默认参数的设置只能由右至左进行设置否则无法使用。
这里写图片描述

不定长参数:
当我们不确定函数该传递多少个参数时我们可以使用不定长参数:

#args本质上是一个元组
def sumFun(n,*args):
    sum=0
    sum=sum+n
    for num in args:
        sum = sum+num
    return sum
print(sumFun(1))
print(sumFun(1,2,3,4,5,6,7,8,9,10)) 

这里写图片描述

四、匿名函数

python 使用 lambda 来创建匿名函数。
lambda 函数的语法只包含一个语句,如下:

lambda [arg1 [,arg2,.....argn]]:expression

第一个匿名函数:

sum = lambda arg1, arg2: arg1 + arg2;

print(sum(12,23))#输出结果35

使用匿名函数我们可以动态的改变函数的功能:

fun1=lambda x,y:x+y
fun2=lambda x,y:x*y

def test(x,y,func):
    return func(x,y)
print("加法:",test(22,22,fun1))
print("乘法:",test(22,22,fun2))

这里写图片描述
动态输入lambda表达式实现动态使用函数:

def test(x,y,fun):
    return fun(x,y)
fun=input("输入你想使用的操作:")
fun=eval(fun)#把字符串转换成可以执行的表达式,必须进行转换
test(22,22,fun)

这里写图片描述
使用匿名函数实现列表的排序:

#列表的每个元素都是字典类型
list=[{'name':'Jake','age':50},{'name':'Amni','age':10},{'name':'Zoo','age':20},{'name':'Bob','age':35}]
#list.sort()是无法实现排序操作的,因为不知道对name还是age进行排序
#这时我们可以使用匿名函数来实现排序
list.sort(key = lambda x:x['age'])#根据age排序
print(list)

这里写图片描述

五、变量作用域

程序中变量并不是所有地方都是可以访问到的,能否访问到此变量需要考虑此变量在哪里。
Python的作用域一共有4种,分别是:

  • L (Local) 局部作用域
  • E (Enclosing) 闭包函数外的函数中
  • G (Global) 全局作用域
  • B (Built-in) 内建作用域

      在访问变量时以 L –> E –> G –>B 的规则查找,即:在局部找不到,便会去局部外的局部找(例如闭包(后续介绍)),再找不到就会去全局找,再者去内建中找。

      Python 中只有模块(module),类(class)以及函数(def、lambda)才会引入新的作用域,其它的代码块(如 if/elif/else/、try/except、for/while等)是不会引入新的作用域的,也就是说这些语句内定义的变量,外部也可以访问。

while(True):
    str="hello python"
#在while代码块外我们依旧可以访问str这一变量
str="Hello JAVA"

六、全局变量和局部变量

局部变量只能在程序特定过程或函数中可以访问。全局变量可以在整个程序中访问。
判断全局变量和局部变量:

sum=0 #这是全局变量
def add(x,y):
    sum=x+y #这是局部变量
    return sum

print(add(1,1))
#输出2
print(sum)
#仍然输出0

我们想通过函数修改全局变量sum的值,因为它是个不可变对象所有通过函数的传参是无法实现的,我们需要使用global关键字:

sum=0
def add(x,y):
    global sum
    sum=x+y
    return sum

print(add(1,1))
#输出2
print(sum)
#输出2,修改成功

猜你喜欢

转载自blog.csdn.net/qq_25343557/article/details/79843871