Python学习笔记-函数

目录

一、函数的创建和调用

1.创建函数

2.函数的调用

二、参数传递

1.形式参数和实际参数

2.位置参数

 3.可变参数

3.1 *parameter可变参数

3.2 **parameter可变参数

4.关键字参数

4.1 关键字参数

4.2 命名关键字参数

5.为参数设置默认值

三、返回值

四、变量的作用域

1.局部变量

2.全局变量

 五、匿名函数


记录python函数的相关内容,通过函数,可以定义一些重复性的操作为函数,方便重复调用。 

Python学习笔记-函数_第1张图片

     

一、函数的创建和调用

1.创建函数

创建格式:

def functionname([parameterlist]):
    ["""comments"""]
    [functionbody]
  • functionname:函数名称
  • parameterlist:可选参数,各个参数间用","分隔,"()"不可省略
  • comments:可选参数,用来为函数指定注释,有定义时,调用函数的时候可以显示注释内容
  • functionbody:可选参数,用于指定函数题,若有返回值则使用return返回结果

2.函数的调用

functionname([parametersvalue])
  • 直接通过函数名调用;
  • funtionname:函数名称,必须是已经创建的函数;
  • parametersvalue:可选参数,对应函数创建时指定的函数参数,多个参数用","分隔,没有参数保留"()";

二、参数传递

1.形式参数和实际参数

  • 形式参数:函数定义是设置的参数;
  • 实际参数:调用函数时实际传递给函数的参数;
  • 值传递:不可变类型进行值传递,改变形参值,实际参数的值不会变;
  • 引用传递:可变数据类型进行,改变形参值,实际参数的值会跟随改变;

示例:

# _*_ coding:utf-8 _*_


# 定义函数
def funcdemo(obj):
    """
    func:打印传入参数,并添加自身
    obj:传入参数,可以是任意类型
    """
    print("调用时:",obj)
    obj += obj

print("-----------值传递------------")
string = "this is a string"     # 字符串为不可变对象
print("调用前:",string)
funcdemo(string)
print("调用后:",string)


print("-----------引用传递------------")
list_test = ["ok","no","NG"]    
print("调用前:",list_test)
funcdemo(list_test)
print("调用后:",list_test)

结果:

-----------值传递------------
调用前: this is a string
调用时: this is a string
调用后: this is a string
-----------引用传递------------
调用前: ['ok', 'no', 'NG']
调用时: ['ok', 'no', 'NG']
调用后: ['ok', 'no', 'NG', 'ok', 'no', 'NG']
>>> 

2.位置参数

位置参数也称必备参数,调用函数时必须按照正确的顺序传递到函数中。

  • 参数数量必须与定义时一致;
  • 参数位置必须与定义时一致。

参数少了或者参数类型错误而内部调用时无法正常转换的会报TypeError。

 3.可变参数

使用可变参数定义函数参数,可以传递任意多个参数。

3.1 *parameter可变参数

以元组形式接收任意更多个参数,可以传入元组

示例:

# _*_ coding:gbk _*_

def printUser(*user):
    for index,item in enumerate(user):
        print("I'm number : {}, my name is : {}".format(index,item))


print(r'printUser("Tom","Jim","Josn")')
printUser("Tom","Jim","Josn")

结果:

printUser("Tom","Jim","Josn")
I'm number : 0, my name is : Tom
I'm number : 1, my name is : Jim
I'm number : 2, my name is : Josn

3.2 **parameter可变参数

以字典形式接受任意多个带参数名的参数,也可以将字典加上“**”直接传入

示例:

# _*_ coding:gbk _*_

def printUser(**user):
    for key,value in user.items():
        print("I'm number : {}, my name is : {}".format(key,value))


print(r'printUser(Tom = "Tom", Jim = "Jim",Json = "Josn")')
printUser(Tom = "Tom", Jim = "Jim",Json = "Josn")


dict_user = {"Tom":"Tom", "Jim":"Jim","Json":"Josn"}
print("dict_user:",dict_user)
printUser(**dict_user)

print(r'printUser("Tom","Jim","Josn")')
printUser("Tom","Jim","Josn")

结果:

printUser(Tom = "Tom", Jim = "Jim",Json = "Josn")
I'm number : Tom, my name is : Tom
I'm number : Jim, my name is : Jim
I'm number : Json, my name is : Josn
dict_user: {'Tom': 'Tom', 'Jim': 'Jim', 'Json': 'Josn'}
I'm number : Tom, my name is : Tom
I'm number : Jim, my name is : Jim
I'm number : Json, my name is : Josn
printUser("Tom","Jim","Josn")
Traceback (most recent call last):
  File "E:\Desktop\Demo.py", line 17, in 
    printUser("Tom","Jim","Josn")
TypeError: printUser() takes 0 positional arguments but 3 were given

注意:

传入类型非字典或者没有参数名时会报错TypeError。

4.关键字参数

4.1 关键字参数

使用形式参数的名称来确认传入的参数值。

使用关键字参数可以不用与定义的参数顺序保持完全一直,只需要保持参数名正确即可,相对会更灵活方便。

示例:

# _*_ coding:gbk _*_

def personInfo(name,age):
    print("My name is : ",name)
    print("My age is  : ",age)


print(r'personInof("Tom",18)')
personInfo("Tom",18)

print(r'personInof(name = "Tom",age = 18)')
personInfo(name = "Tom",age = 18)

print(r'personInof(age = 18,name = "Tom")')
personInfo(age = 18,name = "Tom")

结果:

personInof("Tom",18)
My name is :  Tom
My age is  :  18
personInof(name = "Tom",age = 18)
My name is :  Tom
My age is  :  18
personInof(age = 18,name = "Tom")
My name is :  Tom
My age is  :  18

4.2 命名关键字参数

def functionname([parameterlist],*,[parameterlist1]):
    ["""comments"""]
    [functionbody]
  • 通过“*”分隔函数的参数,*之后的参数就是命名关键字参数,传入是需要指定的名称才行,否则会报错
  • 若先声明了可变参数,则元组可变参数(*parameter)后面的参数为命名关键字参数,不需要再行添加“*”
  • 字典可变参数(**parameter)后不可添加名字关键字参数

示例1,命名关键字参数:

# _*_ coding:utf-8 _*_


# 定义函数
def funcdemo(name,age,*,gender,job):
    """
    func:打印传入参数
    """
    print(name,age,gender,job)
    
funcdemo("小明",18,gender="M",job="混子")  

结果:

小明 18 M 混子
>>> 

若调用时没有使用关键字参数则会报错:

Python学习笔记-函数_第2张图片

 示例2,声明可变参数后,命名关键字参数:

# _*_ coding:utf-8 _*_


# 定义函数
def funcdemo(name,age,*classes,gender,job):
    """
    func:打印参数
    """
    print(name,age,classes,gender,job)
    
funcdemo("小明",18,"英语","数学",gender="M",job="混子")  

结果:

小明 18 ('英语', '数学') M 混子

若没有关键字,则会报错:

Python学习笔记-函数_第3张图片

:字典可变参数后不可添加命名可变参数,否则会报错。

Python学习笔记-函数_第4张图片

5.为参数设置默认值

在定义函数的时候直接定义默认值,这样即使调用函数的时候没有传入参数,函数会自动调用默认值,避免因为参数没有传入导致函数异常报错。

格式:

def functionname([parameterlist = defaultvalue]):
    ["""comments"""]
    [functionbody]
  • functionname:函数名称
  • parameterlist:可选参数,各个参数间用","分隔,"()"不可省略
  • defaultvalue:默认值0,默认参数必须指向不可变对象,建议用None做默认值,若使用可变对象作为默认值,多次调用时可能会发生预期之外的结果。
  • comments:可选参数,用来为函数指定注释,有定义时,调用函数的时候可以显示注释内容
  • functionbody:可选参数,用于指定函数题,若有返回值则使用return返回结果

三、返回值

返回函数值。

return [value]

四、变量的作用域

1.局部变量

局部变量指在函数内部定义并使用的变量,只在函数内部才有效。

示例:

# _*_ coding:utf-8 _*_


# 定义函数
def funcdemo():
    """
    func:打印参数
    """
    obj = "这个是是局部变量"
    print("函数内打印局部变量::",obj)

funcdemo()
print("函数外打印局部变量::",obj)

结果:

函数内打印局部变量:: 这个是是局部变量
Traceback (most recent call last):
  File "D:\Desktop\Demo.py", line 14, in 
    print("函数外打印局部变量::",obj)
NameError: name 'obj' is not defined
>>> 

局部变量只能在函数内使用,在外部调用时会报错NameError。

2.全局变量

全局变量指可以在函数外部使用的变量。有两种定义方式:

  • 在函数体外部定义的变量
  • 在函数体内定义,不过添加global关键字修饰后改为全局变量

示例1,在函数外声明全局变量:

# _*_ coding:utf-8 _*_


# 定义函数
def funcdemo():
    """
    func:打印参数
    """
    print("函数内打印全局变量::",obj)
    
obj = "这个是是全局变量"
funcdemo()
print("函数外打印全局变量::",obj)

        结果:

函数内打印全局变量:: 这个是是全局变量
函数外打印全局变量:: 这个是是全局变量

在外部生命全局变量,在函数内或者函数外都可以正常调用。

示例2,在函数类用global关键字声明全局变量:

# _*_ coding:utf-8 _*_


# 定义函数
def funcdemo():
    """
    func:打印参数
    """
    global obj
    obj = "这个是是全局变量"
    print("函数内打印全局变量::",obj)
    

funcdemo()
print("函数外打印全局变量::",obj)

结果:

函数内打印全局变量:: 这个是是全局变量
函数外打印全局变量:: 这个是是全局变量

注意:

  • 使用global声明时,需要单独一行声明变量,不能声明变量的时候直接赋值。

Python学习笔记-函数_第5张图片

  •  外部调用时需要函数题内部先调用,否则也会报错。

Python学习笔记-函数_第6张图片

 五、匿名函数

使用lamba创建匿名函数,仅使用一次,不需要对函数进行命名。

格式如下:

result = lamba [arg1[,arg2,...,argn]]:expression
  • result:用于调用表达式
  • [arg1[,arg2,...,argn]]:可选参数,指定传递的参数列表,用“,”分隔
  • expression:必选参数,使用某个功能的表达式
  • 参数可以有多个,但表达式只能有一个,并且不能有for或while的表达语句。

六、常用函数

Python常用函数
函数 说明 备注
eval() 获取表达式的值

你可能感兴趣的:(Python,python,学习)