一、函数
1、什么是函数
函数就相当于具备某一功能的工具
函数的使用必须遵循一个原则:
先定义 后调用
函数的定义就是先将函数体代码保存起来,然后将内存地址赋值给函数名,函数名就是对这段代码的引用,这点和变量的定义是相似的,
如果没有事先定义函数而就直接调用,这相当于在应用一个不存在的变量名
2、为何要用函数
如果不用函数:
每实现功能时,都要重复的写一遍代码,简单的还可以,如果真有二三十个地方都用得到这个功能了,需要扩展一下,这二三十个地方
都要修改,如果忘了一处,那只有呵呵了。
所以:
1、组织结构不清晰,可读性差
2、代码冗余
3、可维护性、扩展性差
3、如何用函数
先定义
三种定义方式
后调用
三种调用方式
返回值
三种返回值的形式
函数名与变量名的区别?
函数名:动词
变量名:名词
可以把函数名当作变量名
函数:使用def开头定义
# 一、先定义
# 定义的语法
'''
def 函数名(参数1,参数2,...): def:是python用来定义函数的关键字。函数名:指向函数的内存地址,是对函数体代码的引用。
"""文档描述""" ()括号:可以在括号内定义参数,参数可有可无,可多可少,且无需指定参数的类型。
函数体 冒号:括号后要加冒号,然后在下一行开始缩进编写函数体的代码.
return 值 """文档描述""": 描述函数功能,参数介绍等信息的文档,非必要,但是建议加上,从而增强函数的可读性;
''' 函数体:由语句和表达式组成;return 值:定义函数的返回值,return是可有可无的。
注意:当程序执行遇到return关键字时,停止往下运行。例如:函数体,循环体
参数的定义:参数时函数的调用者向函数体传值的媒介
# 形式一:无参函数:若函数体代码逻辑不依赖于外部传来的参数时则需要定义为无参函数
# def func():
# # x # 这里只是定义一个变量名,定义函数时不会报错,只是检测语法,只有在调用函数时代码执行到此处才会报错。
# # print(x)
# print('哈哈哈')
# print('哈哈哈')
# print('哈哈哈')
# 定义函数发生的事情
# 1、申请内存空间保存函数体代码
# 2、将上述内存地址绑定函数名
# 3、定义函数不会执行函数体代码,但是会检测函数体语法
# 调用函数发生的事情
# 1、通过函数名找到函数的内存地址
# 2、然后加括号就是在触发函数体代码的执行
# print(func) # 打印函数的内存地址:<function func at 0x00000222F60595E0>,也就是说func就是内存地址
# 调用函数():()为被调用的标记
# func()
# 哈哈哈
# 哈哈哈
# 哈哈哈
# 示范1
def bar(): # bar=函数的内存地址 # (4)bar()函数被调用了,执行该函数
print('from bar') # (5)代码执行到了print('from bar'),在控制台先打印出来from bar,该函数体代码执行完毕
def foo(): # (2)被调用了,执行该函数
# print('from foo2')
bar() # (3)代码执行到bar(),调用bar()函数
print('from foo1') # (6)代码执行到了print('from foo1'),在控制台打印出来from foo1,该幻术体代码执行完毕
foo() # (1)调用foo()函数
""" 控制台输出结果如下:
from bar
from foo1
"""
# def bar(): # bar=函数的内存地址
# print('from bar')
# def foo():
# print(bar) # 不加()就是内存地址:<function bar at 0x000000000218A8B0>
# bar()
# print('from foo')
# foo()
"""
# <function bar at 0x000000000218A8B0>
from bar
from foo
"""
# 示范2
# def foo():
# # print(bar)
# bar()
# print('from foo')
#
# def bar(): # bar=函数的内存地址
# print('from bar')
# foo()
# 示范3
# def foo():
# # print(bar)
# bar() # 当程序遇到此处报错,NameError: name 'bar' is not defined
# print('from foo')
#
# foo() # 解释:定义阶段不会报错,只有在调用阶段才会报错
# def bar(): # bar=函数的内存地址
# print('from bar')
# 形式二:有参函数:若函数体代码逻辑依赖于外部传来的参数时,需要定义为有参函数。
# def func(x,y): # x=1 y=2 这里的解释就是x是变量名1为变量值。
# print(x,y)
# func(1,2)
def my_min(x,y):
if x < y :
res = x
else:
res = y
return res
res = my_min(3,5)
print(res)
# 形式三:空函数,函数体代码为pass,此时的函数体什么也不做,pass只充当“占位符”功能。
# def func(x, y):
# pass
定义空函数通常是有用的,因为在程序设计的开始,往往是先想好程序都需要完成什么功能,然后把所有功能都列举出来用pass充当函数体“占位符”,
这将使得程序的体系结构立见,清晰且可读性强。例如要编写一个ftp程序,我们可能想到的功能有用户认证,下载,上传,浏览,切换目录等功能,
可以先做出如下定义:
def auth_user():
"""user authentication function"""
pass
def download_file():
"""download file function"""
pass
def upload_file():
"""upload file function"""
pass
def ls():
"""list contents function"""
pass
def cd():
"""change directory"""
pass
# 三种定义方式各用在何处
# 1、无参函数的应用场景
# def interactive():
# 考虑缩进去的代码是否被写死了?
# name=input('username>>: ')
# age=input('age>>: ')
# gender=input('gender>>: ')
# msg='名字:{} 年龄:{} 性别:{}'.format(name,age,gender)
# print(msg)
#
# interactive()
# interactive()
# interactive()
# interactive()
# 2、有参函数的应用场景:不要写死了,要活的
# def add(x,y): # 参数->原材料
# # x=20 # 这样写就写死了
# # y=30
# res=x + y
# # print(res) print()和return的区别
# return res # 返回值->产品
#
# # add(10,2)
# res=add(20,30)
# print(res)
print()和return的区别
1、使用print()
def add(x,y):
res = x + y
print(res)
add(10,20) # 30
2、return的使用
def add(x,y):
res = x + y
return res
res1 = add(10,20)
print(res1) # 30
# 3、空函数的应用场景(构思程序结构)
# def auth_user():
# """user authentication function"""
# pass # 空函数的标志
#
# def download_file():
# """download file function"""
# pass
#
# def upload_file():
# """upload file function"""
# pass
#
# def ls():
# """list contents function"""
# pass
#
# def cd():
# """change directory"""
# pass
# 二、调用函数
# 1、语句的形式:只加括号调用函数
# interactive()
# add(1,2)
# 2、表达式形式:
# def add(x,y): # 参数-》原材料
# res=x + y
# return res # 返回值-》产品
# 赋值表达式
# res=add(1,2) # add()调用函数,传参,运行函数体,得到的结果3,再给res
# print(res) # 打印res为3
# 数学表达式
# res=add(1,2)*10 # 相当于3*10得到的结果是30,给res赋值
# print(res) # 打印res为30
# 3、函数调用可以当做参数
# res=add(add(1,2),10) # 这里的x=add(1,2)=3,y=10 ,计算的结果是13在赋值给res
# print(res) # 打印res为13
# 三、函数返回值
# return是函数结束的标志,即函数体代码一旦运行到return会立刻终止函数的运行,并且会将return后的值当做本次运行的结果返回:
def func():
print(1111)
return # 函数遇到return就结束
print(2222)
func()
输出结果:1111
# 1、返回None:函数体内没有return
# return
# return None
#
# 2、返回一个值:return 值
# def func():
# return 10
# res=func()
# print(res) # 10
# 3、返回多个值:用逗号分隔开多个值,会被return返回成元组
# def func():
# return 10, 'aa', [1, 2]
#
# res = func()
# print(res, type(res))
# 结果是:(10, 'aa', [1, 2]) <class 'tuple'>
# 有返回值和无返回值比较
def add(x,y):
# x + y # (1)不写return 就默认是返回值None
return x + y # (2)使用return返回结果x+y
res = add(1,2)
print(res)
# (1)运行结果:None
# (2)运行结果:3