您当前的位置:首页 > 计算机 > 编程开发 > Python

python精选10集(函数定义、形参、实参、返回值、函数类型)

时间:04-25来源:作者:点击数:

一、函数

<1>、什么是函数?

在编程中,函数就像数学公式,解决特定的问题而开发存在的。同时可以重复使用,编程的视角里函数通常被设计成一个功能或行为。

  • 所谓函数,就是把具有独立功能的代码块组织为一个小模块,在需要的时候调用
  • 函数的使用包含两个步骤:
    1. 定义函数 ——封装独立的功能
    2. 调用函数 —— 享受封装的成果
  • 函数的作用,在开发程序时,使用函数可以提高编写的效率以及代码的重用

<2>、定义函数

语法:

def 函数名(形式参数):
     函数体

说明:

  1. def是英文define的缩写
  2. 函数名称应该能够表达函数封装代码的功能,方便后续的调用
  3. 函数名称的命名应该符合标识符的命名规则
    • 可以由字母下划线数字组成
    • 不能以数字开头
    • 不能与关键字重名

函数的第一行语句建议使用文档字符串描述函数的功能与参数。##get_number 获取数字

<3>、函数的调用

调用函数很简单的,通过函数名()即可完成对函数的调用

案例演示01

   # 定义一个函数,能够完成打印信息的功能
    def printInfo():
        print '------------------------------------'
        print '         人生苦短,我用Python'
        print '------------------------------------'
    # 定义完函数后,函数是不会自动执行的,需要调用它才可以
    printInfo()

案例演示02

def fun01(a):
  a = 998
  print(a)	#998
b= 996
# 调用函数,会在内存中开辟空间(栈帧),存储函数内定义的变量.
fun01(b)
# 函数执行完毕后,栈帧立即释放.
print(b)  # 996 函数内部的修改,不影响外部.

在这里插入图片描述

二、函数参数

<1>、定义带有参数的函数

# 定义a,b两个参数
def add2num(a, b):
        c = a+b
        print c
# 调用带有参数的函数时,需要在小括号中,传递数据
add2num(110, 22) 
在这里插入图片描述

需求案例

  • 定义一个函数,完成前2个数完成加法运算,然后对第3个数,进行减法;然后调用这个函数
  • 使用def定义函数,要注意有3个参数
  • 调用的时候,这个函数定义时有几个参数,那么就需要传递几个参数
def calculation(a,b,c):
    d = a+b-c
    print(d)

calculation(3,6,3)

<2>、可变/不可变类型在传参时的区别

不可变类型参数 数值型(整数,浮点数,复数)、布尔值bool、None 空值、字符串str、元组tuple、固定集合frozenset
可变类型参数有 列表 list、字典 dict、集合 set

注意

  • 不可变类型的数据传参时,函数内部不会改变原数据的值。
  • 可变类型的数据传参时,函数内部可以改变原数据。

<3>、实参传递方式argument

1、位置传参

  • 定义:实参与形参的位置依次对应。

2、序列传参

  • 定义:实参用*将序列拆解后与形参的位置依次对应。

3、关键字传参

  • 定义:实参根据形参的名字进行对应。

4、字典关键字传参

  1. 定义:实参用**将字典拆解后与形参的名字进行对应。
  2. 作用:配合形参的缺省参数,可以使调用者随意传参。
案例演示
def fun01(a, b, c, d):
  print(a)
  print(b)
  print(c)
  print(d)

#1 位置传参:实参与形参的位置[依次对应]
fun01(1, 2, 3, 4)
# 1 2 3 4
#2 -- 序列传参: * 号将序列拆分后与形参位置依次对应
list01 = [1, 2, 3, 4]
fun01(*list01)
# 1 2 3 4

#3 关键字传参:实参根据形参的[名称进行对应]
fun01(b=1, c=2, d=3, a=4)
#4 1 2 3
fun01(1, 2, d=5, c=2)  # 先位置传参,再关键字传参
#1 2 2 5
# fun01(d=5, c=2,1, 2,)# 先关键字传参,再位置传参(错误)

#4 -- 字典传参: ** 将字典拆分后与形参的名字进行对应
dict01 = {"d": 4, "c": 3, "a": 1, "b": 2}
fun01(**dict01)
# 1 2 3 4

<4>、形参定义方式parameter

1、缺省参数

  • 语法:
def 函数名(形参名1=默认实参1, 形参名2=默认实参2, ...):

   	函数体
  • 说明:
  • 缺省参数必须自右至左依次存在,如果一个参数有缺省参数,则其右侧的所有参数都必须有缺省参数。
  • 缺省参数可以有0个或多个,甚至全部都有缺省参数。

2、位置形参

  • 语法:
def 函数名(形参名1, 形参名2, ...):

函数体

3、星号元组形参

  • 语法:
def 函数名(*元组形参名):

  函数体
  • 作用:
    收集多余的位置传参。
  • 说明:
    一般命名为’args’
    形参列表中最多只能有一个

4、命名关键字形参

  • 语法:
def 函数名(*, 命名关键字形参1, 命名关键字形参2, ...):

函数体
def 函数名(*args, 命名关键字形参1, 命名关键字形参2, ...):
            函数体
  • 作用:
    强制实参使用关键字传参

5、双星号字典形参

  • 语法:
def 函数名(**字典形参名):

函数体
  • 作用:
    收集多余的关键字传参
  • 说明:
    一般命名为’kwargs’
    形参列表中最多只能有一个
案例演示
# 形参
#   -- 默认参数:如果不传递参数,可以使用默认值代替.
def fun02(a=0, b=0, c=0, d=0):
  print(a)
  print(b)
  print(c)
  print(d)

#1 关键字传参 + 默认参数: 可以选择性的为形参赋值
fun02(b=2)  # 为参数b赋值
#0 2 0 0 
fun02(2)  # 为参数a赋值
#2 0 0 0

#2 位置形参
def fun01(a, b, c):
  pass
#print(1,2,3)

#3 星号元组形参: * 让实参个数无限制
def fun02(*args):
    print(args)

# 可以不传递参数
#fun02()     #()
# 也可以传递多个参数
#fun02(1, 2)     #(1, 2)

# 练习:定义函数,数值相加的函数.
def adds(*args):
  sum = 0
  for item in args:
    sum += item
  return sum

#print(adds(1, 2))    #3
#print(adds(1, 2, 3, 4, 5, 6, 7,8))    #36

# 位置形参(必填) + 星号元组形参(可选)
def fun03(a, b, *args):
    print(a)
    print(b)
    print(args)

#fun03(1, 2)    #1 2 ()
#fun03(1, 2, 3)    #1 2 (3,)

#4 命名关键字形参:要求实参必须以关键字传递
def fun04(*, a, b):
    print(a)
    print(b)

fun04(b=1, a=2)    #2 1

# a b 是命名关键字传参
def fun05(*args, a, b):
    print(args)
    print(a)
    print(b)

#fun05(1, 2, 3, 4, 5, a=1, b=2)
#(1, 2, 3, 4, 5) 1 2

#5 双星号字典形参:实参可以传递多个关键字参数
def fun06(**kwargs):
  print(kwargs)

fun06(a=1,b=2,c=3)
#{'a': 1, 'b': 2, 'c': 3}


#6 万能传参:位置传参无限制,关键字传参无限制
def fun07(*args,**kwargs):
  pass

fun07()

def fun08(a,b,*args,c,d,**kwargs):
  pass

小总结

  • ‘定义时小括号中的参数,用来接收参数用的,称为 “形参”
  • 调用时小括号中的参数,用来传递给函数用的,称为 “实参”
  • 参数自左至右的顺序:位置形参 --> 星号元组形参 --> 命名关键字形参 --> 双星号字典形参

三、函数返回值

  • 所谓“返回值”,就是程序中函数完成一件事情后,最后给调用者的结果
  • return后没有语句,相当于返回 None。
  • 函数体没有return,相当于返回None。

<1>、 带有返回值的函数

  def add2num(a, b):
        c = a+b
        return c

或者

 def add2num(a, b):
        return a+b

<2>、保存函数的返回值

保存函数的返回值示例:

 #定义函数
    def add2num(a, b):
        return a+b

    #调用函数,顺便保存函数的返回值
    result = add2num(100,98)

    #因为result已经保存了add2num的返回值,所以接下来就可以使用了
    print result	# 结果 98

四、函数的四种类型

函数根据有没有参数,有没有返回值,可以相互组合,一共有4种

  • 无参数,无返回值
  • 无参数,有返回值
  • 有参数,无返回值
  • 有参数,有返回值

<1>、无参数,无返回值的函数

此类函数,不能接收参数,也没有返回值,一般情况下,打印提示灯类似的功能,使用这类的函数

def printMenu():
    print('--------------------------')
    print(' 学生管理系统 ')
    print('')
    print('  1.  录入学生信息')
    print('  2.  查找学生信息')
    print('  3.  删除学生信息')
    print('--------------------------')

<2>、无参数,有返回值的函数

此类函数,不能接收参数,但是可以返回某个数据,一般情况下,像采集数据,用此类函数

    # 获取温度
    def getTemperature():

        #这里是获取温度的一些处理过程

        #为了简单起见,先模拟返回一个数据
        return 24

    temperature = getTemperature()
    print('当前的温度为:%d'%temperature) # 结果 24

<3>、有参数,无返回值的函数

此类函数,能接收参数,但不可以返回数据,一般情况下,对某些变量设置数据而不需结果时,用此类函数

	def sum(a,b):
		c = a+b
	sum(1,2)

<4>、有参数,有返回值的函数

此类函数,不仅能接收参数,还可以返回某个数据,一般情况下,像数据处理并需要结果的应用,用此类函数

 # 计算1~num的累积和
    def calculateNum(num):

        result = 0
        i = 1
        while i<=num:

            result = result + i

            i+=1

        return result

    result = calculateNum(100)
    print('1~100的累积和为:%d'%result)	#     1~100的累积和为: 5050

小总结

  • 函数根据有没有参数,有没有返回值可以相互组合
  • 定义函数时,是根据实际的功能需求来设计的,所以不同开发人员编写的函数类型各不相同

五、函数嵌套

  • 一个函数里面又调用另外一个函数,这就是函数嵌套调用
  • 如果函数test2中,调用了另外一个函数test1
    • 那么执行到调用test1函数时,会先把函数test1中的任务都执行完
    • 才会回到test2中调用函数test1的位置,继续执行后续的代码
def test1():

    print("*" * 50)
    print("test 1")
    print("*" * 50)


def test2():

    print("-" * 50)
    print("test 2")
    
    test1()
    
    print("-" * 50)

test2()

案例需求

需求 1

  • 定义一个print_line函数能够打印*组成的一条分隔线
def print_line(char):

    print("*" * 50)

需求 2

  • 定义一个函数能够打印由任意字符组成的分隔线
def print_line(char):

    print(char * 50)
    

需求 3

  • 定义一个函数能够打印任意重复次数的分隔线
def print_line(char, times):

    print(char * times)

需求 4

  • 定义一个函数能够打印5 行的分隔线,分隔线要求符合需求 3

提示:工作中针对需求的变化,应该冷静思考,不要轻易修改之前已经完成的,能够正常执行的函数

def print_line(char, times):

    print(char * times)


def print_lines(char, times):

    row = 0
    
    while row < 5:
        print_line(char, times)

        row += 1

 

作业

作业1:

  • 定义函数,删除列表中所有偶数,返回删除的数量

作业2:

  • 定义函数,实现对列表的降序排列

作业3:

# 商品信息列表
		shop_list_infos = [
		    {"cid": 1001, "name": "戴尔", "price": 4634},
		    {"cid": 1002, "name": "华硕", "price": 5743},
		    {"cid": 1003, "name": "苹果", "price": 10325},
		    {"cid": 1004, "name": "惠普", "price": 12000},
		    {"cid": 1005, "name": "小米", "price": 7786},
		]
		# 订单列表
		list_orders = [
		    {"cid": 1001, "count": 3},
		    {"cid": 1002, "count": 1},
		    {"cid": 1005, "count": 5},
		]
		# 1.  定义函数,打印所有商品信息
		# 2.  定义函数,查找商品单价小于1万的商品信息
		# 3.  定义函数,计算订单总价格
		# 4.  定义函数,根据购买数量对订单列表降序排列
方便获取更多学习、工作、生活信息请关注本站微信公众号城东书院 微信服务号城东书院 微信订阅号
推荐内容
相关内容
栏目更新
栏目热门