学会函数让你更加了解python

目录

Python基础语法:函数 

1  函数定义

1.1  函数概述

 1.2 函数的定义

1.3 形参和实参

1.4 函数的返回值

1.5  函数参数

1.5.1 参数种类

1.6 递归函数

1.6.1 递归的思想

1.6.2 递归的使用方法

1.6.3 递归法练习

1.6.3.1 字符串反转   

1.6.3.2 斐波那契数列(1、1、2、3、5、8、13、21、34、……)

1.7 匿名函数


Python基础语法:函数 

1  函数定义

1.1  函数概述

在程序设计中,函数的使用可以提升代码的复用率可维护性

提升代码的复用率: 程序设计中,一些代码的功能是相同的,操作是一样的,只不过针对的数据不一样。此种情况下,可以将这种功能写成一个函数模块,要使用此功能时只需调用这个函数模块就可以了。
提升代码的可维护性: 使用函数后,实现了代码的复用,某个功能需要核查或修改时,只需要核查或修改此功能相对应的函数就可以了。对功能的修改可以使调用该函数的所有模块同时生效,极大提升了代码的可维护性。

内建函数:内建函数也叫内置函数,即系统已经定义好的函数,开发者可以直接调用。为了使开发者对内函数自定义函数有一个直观的认识,下面给出一个简单示例。

调用系统内建函数pow():

pow(4,2)

自定义函数fun1():

def fun1(a, b):
    return a**b


fun1(4, 2)
    

上述代码中,首先调用了Python语言的内建函数pow()进行幂运算;
然后,自定义了一个函数fun1(),功能是输出a的b次幂;最后调用了自定义函数fun1(),输出相应的结果。可以看出,Python语言中函数的定义和使用都是非常便捷的。

 1.2 函数的定义

 在Python语言中,函数通常是由函数名、参数列表以及一系列语句组成的函数体构成的。函数定义的一般格式如下:

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

例如:

def fun1():
    print("hello world")

以上实例定义的fun()函数虽然不包含任何参数,但是函数名后的一对括号不能省略的。在实际应用中,稍复杂的函数通常都会包含一个或多个参数。

下列代码定义了一个计算矩形面积的函数area()和一个欢迎信息打印函数welcome()。

# 计算矩形面积的函数area()
def area(width, height):
    return width * height


# 输出汉英信息的函数
def welcome(name):
    print("Welcome ", name)


# 调用welcome函数
welcome('张三')
# 调用area函数
w = 4
h = 9
print("with=", w, "height=", h, "area=", area(w, h))

上述代码中,首先定义了area()和welcome()两个函数,其中函数area()提供了width(宽)和height(高)两个参数,函数welcome()函数只提供了一个参数name。然后,分别调用了area()和welcome()函数,在控制台输出了相应的结果,结果如下:

Welcome  张三
with= 4 height= 9 area= 36

以下代码定义了无任何操作的空函数fun1()。

def fun1():
    pass

在Python代码中,pass语句通常可以用来作为占位符,表示什么操作都不执行。比如在项目起始阶段,如果还没想好函数具体实现时,可以先放置一个pass语句,让代码先成功运行起来。待项目框架搭建完毕后,在进行相应的具体实现。

通常情况下,在Python语言中定义一个具有特定功能的函数需要符合以下规则:

  • 函数代码块以def关键字开头,后接函数标识符名称和形参列表;
  • 任何传入的参数和自变量必须放在圆括号内;
  • 函数的第一行语句可以选择性地使用文档字符串(即函数说明);
  • 函数内容以冒号起始,并且严格统一缩进;
  • 函数都有返回值,默认返回None。

1.3 形参和实参

在编程语言中,函数定义时用的是形参调用时用的是实参

  • 形参(parameter),全称为"形式参数",不是实际存在的变量,又称虚拟变量。形参是在定义函数名和函数体的时候使用的参数,目的是用来接收调用该函数时传入的参数。

  • 实参(argument),全称为"实际参数",是在调用时传递给函数的参数。实参可以是常量、变量、表达式、函数等。无论实参是何种类型的量,在进行函数调用时,它们都必须具有确定的值,以便把这些值传送给形参。

  • 形参和实参的功能是数据传送。

在调用函数时,实参将赋值给形参。必须注意实参的个数、类型应与形参要一一对应,并且实参必须要有确定的值。形参的作用域一般仅限函数体内部,而实参的作用域根据实际设置而定。

以计算面积的函数为例:

# 计算矩形面积的函数area()
def area(width, height):
    return width * height


# 调用area函数
w = 4
h = 9
print("with=", w, "height=", h, "area=", area(w, h))

上述代码中,函数area()定义处的width和height就是形式参数,函数体外定义的变量w和h是实际参数。可以看到,把实参w和h传入函数体后,就把相应的值赋值给了形参width和height。形参width和height的作用域只限于area()函数体内,而实参w和h作用域则根据外部调用处的设置而定。

对于函数形参列表,默认情况下函数调用时的参数值与参数列表声明中定义的顺序是一致。Python语言也允许函数调用时参数顺序与声明时不一致,即显示指明关键字参数,并根据参数的指定进行赋值。

def fun1(x, y):
    print('x+y=', x + y)
    print('x*y=', x * y)


# 等效于fun1(x=3,y=2),也等效于fun1(3,2)
fun1(y=2, x=3)

上述代码中,函数fun1()定义时形式参数的顺序是fun1(x, y),但是调用时实际参数的顺序确是fun1(y = 1, x = 2)。这是因为Python语言中提供了一种关键字参数的机制,可以给开发者提供更大的灵活性。

1.4 函数的返回值

  • 函数的返回值是函数执行完成后,系统根据函数的具体定义返回给外部调用者的值。

  • 在实际开发中,有时不仅仅要执行某个函数的功能,而且还需要把该函数的执行结果作为其他函数或功能的计算单元。所以,函数返回值是非常有用的

  • 在Python语言中,当函数运行到return语句时即执行完毕,同时将结果返回。因此,可以在函数内部通过条件判断和循环设置实现较复杂的逻辑,并返回预期的结果。如果没有return语句,函数体内所有语句执行完毕后默认返回None,返回值可以是多个。

# 函数定义
def add(x, y):
    print('x+y=', x + y)
    return x + y


# 函数调用
result = add(y=1, x=2)
print(result)

上述代码中,定义的add()函数返回“x+y”的运算结果。可以看到,调用该函数后,把该函数的返回值赋值给了变量result ,最后输出了变量result 的值。

另外需要注意的是,在Python语言中,函数也可以有多个返回值,例如:

# 函数定义
def add(x, y):
    print('x+y=', x + y)
    print('x*y=', x * y)
    return x + y, x * y


# 函数调用
a, b = add(y=1, x=2)
print(a, b)

上述代码中,定义的add()函数有连个返回值,分别是“x+y”和“x*y”。可以看到,调用该函数后,把该函数的返回值分别赋值给变量a,b,最后输出了变量a和变量b的值。
注意: 返回值和接收变量的对应关系,是按照顺序一一对应的

1.5  函数参数

1.5.1 参数种类

  函数参数分为可变类型和不可变类型,其调用结果是不同的。
(1)可变类型:如列表、字典等。如果传递的参数是可变类型,则在函数内部对传入参数的修改会影响到外部变量。
(2)不可变类型:如整数、字符串、元组等。如果传递的参数是不可变类 型,则在函数内部对传入参数的修改不会影响到外部变量。

  1. 位置形参 :调用函数时,Python语言必须将函数调用中的每个实参都关联到函数的相应形参。最简单的关联方式是基于实参的顺序,这种关联方式被称为位置实参。下面代码显示学生信息的函数,该函数输出学生的名字及年龄。
  2. 关键字形参 : 关键字实参是传递参数时使用“名称–值”对的方式,在实参中将名称和值关联起来。关键字实参让开发者无需考虑函数调用中的实参顺序,清楚地指出了函数调用中各个值的用途。关键字参数有扩展函数的功能。
  3. 默认形参 : 编写函数时,可给每个形参指定默认值。在调用函数时,如果给形参提供了实参,Python语言将使用指定的实参值;否则,将使用形参的默认值。给形参指定默认值后,可在函数调用中省略相应的实参。使用默认值可简化函数调用,还可清楚地指出函数的典型用法。如下方式调用describe_student()函数会出现错误。
  4. 可变元组形参  :要出现在位置参数后面,还要出现在默认参数后面
  5. 可变字典形参  : 要出现在所有参数的最后,使用关键字赋值的参数都会到字典中
def myfun1(first, second, third="*", *args, **kwargs):
    print(first, second, third, args, kwargs)


myfun1("!", "@",  "^", "&", "*",abc= "小明", a="小红" )


结果:
! @ ^ ('&', '*') {'abc': '小明', 'a': '小红'}

1.6 递归函数

函数作为一种代码封装,可以被其他程序调用,当然,也可以被函数内部代码调用。这种函数定义中调用函数自身的方式称为递归。就像一个人站在装满镜子的房间中,看到的影像就是递归的结果。递归在数学和计算机应用上非常强大,能够非常简洁的解决重要问题。

1.6.1 递归的思想

把规模大的问题转化为规模小的、具有与原来问题相同解法的问题来解决。在函数实现时,因为解决大问题的方法和解决小问题的方法往往是同一个方法,所以就产生了函数调用它自身的情况。

1.6.2 递归的使用方法
  1. 找到递归关系,即把一个复杂的问题转化为与它形式相似、但规模较小的问题
  2. 找到递归出口,即问题转化时,当规模足够小,可以直接求解
1.6.3 递归法练习
1.6.3.1 字符串反转   

对于用户输入的字符串s,输出反转后的字符串。解决这个问题的基本思想是把字符串看作一个递归对象。

def rev(s):  # 反转字符串
    if len(s) == 1:
        return s
    else:
        return s[-1]+rev(s[:len(s)-1])
 
 
s = input()
print(rev(s))

结果:
helop
poleh
1.6.3.2 斐波那契数列(1、1、2、3、5、8、13、21、34、……)
def find_num(n):
    first = 1
    second = 1
    now = None
    for i in range(3, n + 1):
        now = first + second
        first = second
        second = now
    # print(f"第{n}个数是{now}")
    return now


r = find_num(9)
print(r)

结果:
34

斐波那契的递归实现版本里面有很多冗余计算,可以通过增加缓存来优化。所以find_num()中的数要小一点,太大计算机运算也要很久。

1.7 匿名函数

所谓匿名函数,即不再使用def语句这样标准形式定义的函数。Python语言经常使用lambda来创建匿名函数。lambda 只是一个表达式,函数体比def定义的函数体要简捷。lambda函数的语法如下所示。

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

举例:(这是一个很简单的匿名函数)

sum = lambda arg1, arg2: arg1 + arg2
print(sum(1, 2)) # 结果是:3

上述代码中,第一行定义了一个lambda函数,执行两个数的和运算,并且把该lambda函数命名为sum。会面的代码通过sum()函数即实现了调用lambda函数的功能。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值