1 Fork me on GitHub

python函数

1.  目录
  • 函数的作用
  • 函数定义
  • 函数调用
  • 参数传递
  • 函数返回值

一般代码都是从上到下依次去执行的,如果某段代码需要重复的去使用的话,就得把这段代码赋值很多次,这种做法影响开发效率,不推荐这么做,
使这段代码多次被使用的话,可以用函数解决这样的问题。

什么是形参

就是“形式参数”是在定义函数名和函数体的时候使用的参数,目的是用来接收调用该函数时传递的参数。
在调用函数时,给形参分配存储单元,实参可以是常量、变量或者表达式,且要与形参类型一致!而且实参要有确定的值,在调用过程中实参将值赋给形参,并将实际参数对应的数值传递给形式参数;
自定义函数中的“形参”全称为"形式参数" 由于它不是实际存在变量,所以又称虚拟变量。实参和形参可以重名。是在定义函数名和函数体的时候使用的参数,目的是用来接收调用该函数时传入的参数.

形参和实参的特点

1、形参变量只有在被调用时才分配内存单元,在调用结束时,即刻释放所分配的内存单元。因此,形参只在函数内部有效。函数调用结束返回主调用函数后则不能再使用该形参变量。
2、实参可以是常量、变量、表达式、函数等,无论实参是何种类型的量,在进行函数调用时,它们都必须有确定的值,以便把这些值传送给形参。因此应预先用赋值,输入等办法使参数获得确定值。
3、实参和形参在数量上,类型上、顺序上应严格一致,否则就会发生类型不匹配的错误。

 



1.  函数的作用

函数是组织好的,可重复使用的,用来实现单一或相关联功能的代码段。
函数能提高应用的模块性和代码的重复利用率。
python 内置函数:https://docs.python.org/zh-cn/3.8/library/functions.html                   主要看一下提供什么功能和怎么用




2.  函数定义

def:函数定义关键词
function_name:函数名称
():参数列表放置的位置,可以为空
parameter_list:可选,指定向函数中传递的参数 参数可以传递参数,参数可以传递多个,每个参数用逗号相隔开即可。也可以不传,不传为空。为空调用时不传入。
comments:可选,为函数指定注释,一般来说用来说明函数的功能的。比如传进来的函数的用处、函数的功能等。
function_body:可选,指定函数体

语法:
def  function_name([parameter_list]):
  [''' comments (注释)''']                                      # 三引号之间可以写上一个文档型注释,注释下面写函数体。

2.1  定义函数

def func_demo():
    # 函数体的定义
    print("这是一个函数")

2.2  定义传递参数的函数(这里注释了打印函数)

def func_demo():
    # 函数体
    print("这是一个函数")

def func_with_params(a,b,c):
    '''
    这是一个携带参数的注释
    '''
    print(f"传入的参数为:a={a},b={b},c={c}")       

#  打印函数的 comments 的内容
# print(func_with_params.__doc__)    #  打印函数的comments内容
# help(func_with_params)        # 效果是一样的,这个也可以打印,用help直接把函数名称传进去,不同小括号

2.3  定义空函数

def filer_char(s):
    pass            # 占位符,还没想好里面实现逻辑,用pass占住,没有pass会报错的;也可以用comments加注释进行占位。
    '''
    功能:过滤铭感词   #  也可以用注释进行占位
    '''

 



3.  定义函数的注意事项

缩进:python 是通过严格的缩进来判断代码块儿
  函数体和注释相对于 def 关键字必须保持一定的缩进,一般都是 4 个空格
  pycharm 自动格式化快捷键:ctrl+alt+L
定义空函数
  使用 pass 语句占位
  写函数注释 comments


4.  函数调用

function_name:函数名称
parameter_value:可选,指定各个参数的值

语法:

function_name ([parameter_value])

定义的函数没有去调用的话是不会生效的。调用函数也就是执行函数


接例2.1:  调用函数(这个函数没有传参数)

def func_demo():      
    # 函数体
    print("这是一个函数")
func_demo()    #  调用函数。  调用了之后函数体就执行了,把print打印到了控制台上。没有调用不会打印。

返回

 

接例2.2:    调用函数(这个函数有传参数)

def func_with_params(a,b,c):
    print(f"传入的参数为:a={a},b={b},c={c}")
func_with_params(1,2,3)   # 调用函数,调用了传入进来的对应的值

 返回

 


 

5.  参数传递
形式参数:定义函数时,函数名称后面括号中的参数
实际参数:调用函数时,函数名称后面括号中的参数

# a, b, c 为形式参数
def demo_func(a, b, c):
    print(a, b, c)
# 1, 2, 3 为实际参数
demo_func(1, 2, 3)

返回:



 

6.  位置参数
数量必须与定义时一致
位置必须与定义时一致

def demo_func(a, b, c):
    print(a, b, c)
# 1 赋值给 a, 2 赋值给 b, 3 赋值给 c
demo_func(1, 2, 3)

返回:



6.1  位置参数错误例子,数量错误

def demo_func(a, b, c):
    print(a, b, c)
demo_func(1, 2)    # 数量错误(这里举少传例子,多传也会错误)

返回

 

6.2  位置不对的话,得到的结果是错误的。如果是不同数据类型还可能报别的错误。这种传参参数多时容易出错
例子:位置传参中,错误位置

def person(name,age):
    print(f"姓名为{name}")
    if age >= 18:
        print(f"{name} 已成年")
    else:
        print(f"{name} 未成年")
person(20,"lily")    #  错误位置
# person("lily",20)      #  正确位置

返回的错误

 


 

7.关键字参数
使用形式参数的名字确定输入的参数值
不需要与形式参数的位置完全一致
后面学习大部分用这种方式传参

def demo_func(a, b, c):
    print(a, b, c)
demo_func(a=1, b=2, c=3)

返回

 
例子:用关键字传参,不容易出错

def person(name,age):
    print(f"姓名为{name}")
    if age >= 18:
        print(f"{name} 已成年")
    else:
        print(f"{name} 未成年")
person(age=12,name= "tom")      # 调换位置,使用关键字传参

返回

 


 

8.  为参数设置默认值
定义函数时可以指定形式参数的默认值
指定默认值的形式参数必须放在所有参数的最后,否则会产生语法错误
param=default_value:可选,指定参数并且为该参数设置默认值为 default_value
默认值一定要用不可变对象,否则的话默认值可能会随着调用发生变化:
  我们在定义函数的时候,如果你要给形式参数设置默认值的话,这个默认值一定要用不可变对象。比如:字符串、数字、布尔值,元祖等等不可变对象。可变对象,比如:列表、字典等这些可变对象不要去用。


使用场景:有的时候,有的参数不想让它每次都传,因为它可能基本上是个固定的值,这个时候可以给参数设定一个默认值。
这个默认值怎么设定呢?我们可以直接在定义函数的时候,直接在传参的列表里面,把它的默认值加上即可。
指定默认值的参数要放在最后面,没有指定默认值的参数放在前面,这样才不会报错。

def function_name(..., [param=default_value]):
    [function_body]

返回



例子:

def person(name,age,nationality="中国"):
    print(f"姓名为{name}")
    print(f"国籍为:{nationality}")
    if age >= 18:
        print(f"{name} 已成年")
    else:
        print(f"{name} 未成年")
person("lily",20)      #  正确位置

返回

 

错误例子1:指定参数默认值没放在最后面

def wrong_demo(a=1,b,c):
    pass

返回的错误提示

 

错误例子2:默认值为可变对象举例,默认值为空列表时,举例子

#  默认值一定要不可变对象,否则的话默认值会随着调用发生变化这样的话代码就会不可控了
def wrong_demo2(a,b,c=[]):          #  设置默认值为空列表
    c.append(a)
    c.append(b)
    print(a,b,c)
wrong_demo2(1,2)    # 我希望c为默认值,但是现在c已经不是默认值了,把1,2添加了进来
wrong_demo2(3,4)    # c还在继续往里面添加,默认值发生变化了

返回

 

 

 


 

9.   函数返回值
- value:可选,指定要返回的值

def function_name([parameter_list]):
    [''' comments ''']
    [function_body]
    return [value]

 
在函数体里面使用return这样的关键字,就可以指定函数的返回值。如果一个函数里面没有return语句或者只写了return语句但是后面没有跟对应的一个值的话,那么函数会默认返回None也就是空值。

例子1:返回一个值

# 定义加法函数
def sum(a,b):            # 传入两个参数
    result = a+b         # 定义result,让a和b相加
    #  函数的返回值
    return result    # 把相加的结果返回出去,让其他的地方用到这个结果,这个时候就可以用return跟返回的值即可。到这里整个函数体没有执行任何打印操作,只是执行了一个加法操作,并且把最终的结果返回回来了
r = sum(1,2)         #  要用到这个函数的话,定义一个变量,用这个变量接收函数的返回值。这里先变量调用这个函数,然后在函数里面传入1和2,之后result就会被赋值给r.
print(r)             #  之后打印r,也就是1和2相加的结果

返回

 

例子2:返回多个值。所有的返回值都会保存在一个元祖之中。

def sum(a,b):
    result = a+b
    #  函数的返回值
    return result,a,b    # 把a和b一并返回回来。返回回来之后result就会是一个元祖。所有的返回值会保存在一个元祖当中。
r = sum(1,2)
print(r)   

返回

 

例子3:没有retuen举例。如果没有return语句,你去打印调用的结果的话,默认返回空值

def sum(a,b):
    result = a+b
r = sum(1,2)
print(r)

返回

 

例子4:函数体里面打印举例

def sum(a,b):
    result = a+b
    print(result)    #  直接在函数体里面打印
    #  函数的返回值
    # return result,a,b    # 把a和b一并返回回来。返回回来之后result就会是一个元祖。所有的返回值会保存在一个元祖当中。
r = sum(1,2)      # 在外面不打印,在函数体打印,直接调用函数,可以打印计算结果,因为这是函数体当中所做的操作
# print(r)       # 这里取消注释,非要再次去打印函数哦调用结果的话,这里部分打印的是none,因为前面定义的函数没有return,没有返回值,所以他会打印默认的返回值None

返回

 如果打印函数调用的结果的话,一定要保证函数是有返回值的才能去打印出来;如果没有返回值,打印的就只能是默认返回值None。




 

图解函数:

https://blog.csdn.net/ShowMeAI/article/details/123087795

函数的返回值
https://blog.csdn.net/qq_39314932/article/details/83051973?spm=1001.2101.3001.6661.1&utm_medium=distribute.pc_relevant_t0.none-task-blog-2%7Edefault%7EBlogCommendFromBaidu%7Edefault-1-83051973-blog-110344213.pc_relevant_default&depth_1-utm_source=distribute.pc_relevant_t0.none-task-blog-2%7Edefault%7EBlogCommendFromBaidu%7Edefault-1-83051973-blog-110344213.pc_relevant_default&utm_relevant_index=1
posted @ 2022-04-29 17:54  v_jjling  阅读(85)  评论(0编辑  收藏  举报
AmazingCounters.com