python学习之路 - python的函数

目录

一、python函数

1、函数介绍

函数:是组织好的、可重复使用的、用来实现特定功能的代码段

java 复制代码
name = "这是字符串"
length = len(name)
print(length)

能直接调用len方法,则len()是python内置的函数

2、函数的定义

a、基本语法

java 复制代码
def 函数名(传入参数):
	函数的内容
	return 返回值

b、案例

定义简单的函数并调用

java 复制代码
#定义函数
def output_content():
    print("hello")

#调用函数
output_content()

如果不调用函数,函数的内容不会执行,只有调用后才会执行
要先定义函数,后调用函数。没有定义函数前无法调用

3、函数的参数

a、基本介绍

功能:在函数进行计算的时候,接收外部提供的数据

多个参数之间用逗号分隔开

java 复制代码
def 函数名(参数1,参数2,参数3):
	函数的内容
	return 返回值

b、案例

创建一个函数,传入两个数字,打印两个数字的和

java 复制代码
def get_sum_num(x , y):
    print(f"和为{x + y}")
    
get_sum_num(1,2)

函数定义中,提供的x,y称为形式参数(形参),表示函数要两个参数

函数调用中,提供的1,2称为实际参数(实参),表示函数执行时使用的参数

4、函数的返回值

a、基本介绍

函数在完成事情之后,最后要返回给调用者的结果

java 复制代码
def 函数名(参数):
	函数的内容
	return 返回值

变量 = 函数名(参数)

b、案例

定义一个函数,将2数相加的内容返回给调用者并打印

java 复制代码
def get_sum_num(x,y):
    return x + y

result = get_sum_num(1,2)
print(f"结果为:{result}")

c、补充

思考:如果定义的函数没有使用return语句返回数据,那么函数有返回值吗?

  • 实际上是有的,这时会返回特殊的字面量None,类型为<class 'NoneType'>
  • None表示的是空的,无实际意义的意思,函数返回None,也就表示没有返回有意义的内容,也就是返回了空的意思
  • 在if判断中,None等同于False,可以联合if判断函数是否有返回内容
  • 在定义变量时,暂时不需要变量有具体值时,可以用None代替。如name = None

5、函数说明文档

a、基本语法

函数是纯代码语言,想要理解含义就需要一行行的阅读代码

我们可以给函数添加说明文档,辅助理解函数的作用

java 复制代码
def func(x,y):
    """
    func函数可以接收2个参数,并返回两个参数的相加值
    :param x: 参数1
    :param y: 参数2
    :return: 返回的两个值的和
    """
    return x + y

result = func(1,2)

在pycharm中,当鼠标悬停到函数调用的传参时,会出现说明文档

6、函数的嵌套调用

a、基本语法

在一个函数中调用另一个函数,就是函数的嵌套调用

b、案例

在函数a中调用b输出内容

java 复制代码
def fun_b():
    print("b")

def fun_a():
    print("a")
    fun_b()
    
fun_a()

7、变量的作用域

  • 局部变量
    定义:定义在函数体内部的变量,即只在函数体内部生效
    作用:在函数体内部临时保存数据,当函数完成后,则销毁局部变量
java 复制代码
def func():
	num = 100
	print(num)

# 这个num就是局部变量
  • 全局变量

定义:在函数体内、体外都能生效的变量

java 复制代码
num = 100
def func_a():
	print(num)

def func_b():
	print(num)

# 这个nun就是全局变量
  • 思考:看如下代码,试想,最后会输出多少呢?
java 复制代码
num = 100
def func_a():
    num = 200
func_a()
print(num)

最后是会输出100,因为func_a方法中的num是一个局部变量,只会影响函数内部的值

  • 思考:如果我们想在函数内部作用全局变量呢?

可以使用global关键字,定义全局变量

java 复制代码
num = 100
def func_a():
    global num
    num = 500

func_a()
print(num)				这时就会输出500

8、综合案例

案例要求:开发一个存款取款的函数,定义4个函数,共有4个功能,分别为查询余额1、存款2、取款3、退出4,用户分别输入对应的数字则进入对应的功能,用户未输入4前程序要永久运行

java 复制代码
bol = True
name = ""
total_num = 5000000

# 存款函数
def add_money():
    global total_num
    put_num = int(input("请输入存款金额:"))
    total_num += put_num
    print(f"{name}您好,您的余额为:{total_num}元")

# 取款函数
def get_money():
    global total_num
    put_num = int(input("请输入取款金额:"))
    total_num -= put_num
    print(f"{name}您好,您的余额为:{total_num}元")

# 查询余额函数
def check_money():
    print(f"{name}您好,您的余额为:{total_num}元")

#主函数
def main():
    global bol
    global name
    name = input("请输入您的姓名:")
    while bol:
        print(f"{name}你好,请选择操作\n查询余额\t[输入1]\n存款\t[输入2]\n取款\t[输入3]\n退出\t[输入4]")
        num = input("请输入您的选择:")
        if num == "1":
            check_money()
        elif num == "2":
            add_money()
        elif num == "3":
            get_money()
        else:
            bol = False
main()

9、函数与方法的区别

函数的定义方式:

java 复制代码
def add(x,y):
	return x + y

方法的定义方式:

java 复制代码
class Student
	def add(x,y):
		return x + y

函数和方法功能一样,有传入参数,也有返回值,只是使用时不同。

使用函数时:

java 复制代码
num = add(1,2)

使用方法时:

java 复制代码
student = Student()
num = student.add(1,2)

二、python函数进阶

1、函数多返回值

多个返回值用逗号分隔开

java 复制代码
def fun1():
    return 1,'hello',True

x,y,z = fun1()
print(x)		结果为1
print(y)		结果为hello
print(z)		结果为True

2、函数多种传参方式

a、位置参数

传参的位置固定,自动匹配参数值

java 复制代码
def fun1(name,age,sex):
    print(f"姓名:{name},年龄:{age},性别:{sex}")
fun1("张三",18,"男")

结果为:姓名:张三,年龄:18,性别:男
b、关键字参数

调用函数时通过键值对的形式传参

java 复制代码
def fun1(name,age,sex):
    print(f"姓名:{name},年龄:{age},性别:{sex}")
fun1(age=18,sex="男",name="张三")

结果为:姓名:张三,年龄:18,性别:男
c、缺省参数
  • 缺省参数也叫默认参数,定义函数如没有传入值,则提供参数的默认值
  • 有默认值的参数需要写到无默认值参数的后面
java 复制代码
def fun1(name='李四',age=18,sex='女'):
    print(f"姓名:{name},年龄:{age},性别:{sex}")
fun1(sex="男",name="张三")

结果为:姓名:张三,年龄:18,性别:男
d、不定长参数
  • 不定长参数也叫可变参数,用于不确定调用时需要传递参数的个数
  • 分为位置传递不定长参数和关键字传递不定长参数
java 复制代码
# 位置传递不定长参数
def fun1(*args):
    print(args)				此时的数据类型为元组
fun1('张三',18,'男')
结果为:('张三', 18, '男')		需要以直接传入的方式传参

# 关键字传递不定长参数
def fun1(**kwargs):
    print(kwargs)			此时的数据类型为字典
fun1(name='张三',age=18,sex='男')		需要用key-value的形式传参
结果为:{'name': '张三', 'age': 18, 'sex': '男'}

3、匿名函数

a、函数作为参数传递

函数本身也能作为参数传入另一个函数种

java 复制代码
def fun1(fun2):
    result1 = fun2		在一个函数种调用参数传入的另一个函数
    print(result1)

def fun2(x , y):
    return x + y

fun1(fun2(1,2))			调用时传入函数名和函参数
b、lambda匿名函数
  • 特点:

    • lambda可以定义匿名函数,就是无名称的函数
    • 有名称的函数可以重复使用,匿名函数只能使用一次
    • lambda定义的匿名函数函数体只能写一行,无法写多行
  • 基本语法:lambda 入参: 函数体(一行代码)

java 复制代码
def fun1(fun2):
    result1 = fun2(1,2)
    print(result1)
fun1(lambda x,y:x+y)		参数为x和y,函数体为x+y

结果为:3
相关推荐
秋天下着雨2 分钟前
apifox调用jar程序
java·python·jar
bs_1015 分钟前
【保姆式】python调用api通过机器人发送文件到飞书指定群聊
python·机器人·飞书
Redamancy_Xun33 分钟前
软件老化分析
python·程序人生·安全威胁分析·可信计算技术·安全架构
geovindu35 分钟前
python: Oracle Stored Procedure query table
数据库·python·mysql·postgresql·oracle·sqlserver·mssql
工业甲酰苯胺1 小时前
聊一聊 C#线程池 的线程动态注入
java·开发语言·c#
zfenggo1 小时前
c/c++ 无法跳转定义
c语言·开发语言·c++
NiNg_1_2341 小时前
Python中SKlearn的K-means使用详解
python·kmeans·sklearn
向宇it1 小时前
【从零开始入门unity游戏开发之——C#篇30】C#常用泛型数据结构类——list<T>列表、`List<T>` 和数组 (`T[]`) 的选择
java·开发语言·数据结构·unity·c#·游戏引擎·list
葡萄架子1 小时前
Python中的logger作用(from loguru import logger)
java·前端·python
hakesashou1 小时前
python怎么看矩阵维数
开发语言·python