第六章 函数
6.1 函数的基本使用
6.2 函数的参数和返回值
6.3 变量作用域
6.4 lambda函数
6.5 time库
知识导入
【微实例】 为朋友唱生日歌,歌词为:
Happy birthday to you!
Happy birthday to you!
Happy birthday ,dear <名字>
Happy birthday to you!
编写程序为Mike和Lily输出生日歌。
#简单实现
print("Happy birthday to you!")
print("Happy birthday to you!")
print("Happy birthday,dear Mile !")
print("Happy birthday to you!")
如何将其功能封装起来,为不同的人输出生日歌呢?
- 人们在求解某个复杂问题时,通常采用逐步分解、分而治之的方法,也就是将一个大问题分解成若干个比较容易求解的小问题,然后分别求解。
- 程序员在设计一个复杂的应用程序时,当编写的代码越来越多,越来越复杂,为了使程序更简洁、可读性更好、易于维护,可把整个程序划分成若干个功能较单一的程序模块,再把所有的程序模块像搭积木一样组装起来。
- Python语言通过函数来实现程序的模块化,模块可以看作是一组函数的集合,一个模块可以包含若干个函数。
6.1 函数的基本使用
函数
- 函数是一段具有特定功能的、可重用的语句组
- 函数也可以看作是一段具有名字的子程序,可以在需要的地方调用执行
- 函数能够完成特定的功能,与黑盒类似,对函数的使用不需要了解函数内部实现原理,只要了解函数的输入输出方式即可
- Python中函数包括内置函数(eval(),print()…),标准库中的函数(turtle.circle(),random.randint()…),用户自定义函数
- 通过使用函数主要完成两个目的:增加代码可读性与增加代码复用性
使用函数的优点
- 一次编写,多次引用
- 增加程序的可读性
- 降低了代码的维护难度
1 函数的定义
def <函数名>(<形式参数列表>):
<函数体>
return <返回值>
函数的定义
- 函数定义以 def 关键字开头,后接函数名和圆括号()
- 函数名可以是任何有效的Python标识符
- 函数的参数列表用逗号隔开,参数列表里的参数是“形式参数”,简称“形参”
- 函数体是函数每次调用时执行的代码,由一行或多行语句组成
- return语句表示函数调用到此结束,并且将返回值传递给调用语句。如果没有return语句,仅表示执行了一段代码,在函数体结束位置将返回函数的调用处,不返回任何值
2 函数的调用
<函数名>(<实际参数列表>)
- 函数的定义 也叫函数"声明",定义后的函数不能直接运行,需要经过"调用"才能得到运行。也就是函数要先定义再调用
- “实际参数列表”简称“实参”用于指定相应的参数值。如果需要传递多个参数值,则各参数值使用逗号","分隔。如果该函数没有参数,则直接调用即可。
- 每次使用函数可以提供不同参数作为输入,以实现对不同数据的处理;函数执行后,可以反馈相应的处理结果
函数的使用总结
def 榨果汁(水果):
榨汁机工作
return 果汁
s=榨果汁(橙子)
print(s)
def 榨果汁(*水果):
榨汁机工作
return 果汁
s=榨果汁(橙子,苹果,葡萄)
print(s)
1. 函数定义
使用def关键字定义为函数,同时需要确定函数名称、参数的个数、参数名称、并使用参数名称作为形式参数(占位符)编写函数内部代码。
2. 函数调用
通过函数名调用函数,并对函数的各个参数赋予实际值(实参),实际值可以是实际数据,也可以是在调用函数前已经定义过的变量或表达式。
3.函数执行
函数被调用后,使用实际参数(赋予形式参数的实际值)参与函数内部代码的运行,如果在函数运行过程中有输出语句则进行输出。
4.函数返回
函数执行结束后,根据return关键字的指示决定是否返回结果,如果返回结果,则结果将被放置到函数被调用的位置,函数使用完毕,程序继续运行。
def add(a,b):
return a+b
c=add(3,5)
print(c)
x,y=4,6
m=add(x,y)
print(m)
6.2 函数的参数和返回值
1 函数的参数
实际参数:
- 当函数被调用时参数表中提供的参数称为实际参数,简称实参。
- Python 中的变量保存的是对象的引用,调用函数的过程就是将实参传递给形参的过程。
- 函数调用时,实参可分为位置参数和赋值参数两种情况。
#位置参数
def rectangle(x,y):
s=x*y
return s
#赋值参数
print("area1=",rectangle(3,5))
print("area2=",rectangle(x=3,y=5))
print("area3=",rectangle(y=5,x=3))
程序的运行结果
area1= 15
area2= 15
area3= 15
形式参数:
- 函数的参数在定义时可以指定默认值,带有默认值的参数是可选参数,不带默认值的参数为必选参数,必选参数在前,可选参数在后
- 当函数被调用时,如果没有传入对应的参数值,则使用函数定义时的默认值替代
def rectangle(x,y=6):
s=x*y
return s
print("area1=",rectangle(3))
print("area2=",rectangle(x=3)
print("area3=",rectangle(3,5))
print("area3=",rectangle(y=5,x=3))
程序的运行结果
area1= 18
area2= 18
area3= 15
area3= 15
可变参数
- <形式参数列表>为定义的传统形式参数,代表一组参数
- *args 为可变参数。
- 函数被调用时传入的参数个数会优先匹配 <形式参数列表>中参数的个数
- *args 以元组的形式保存多余的参数
- 当函数被调用时,如果没有传入对应的参数值,则使用函数定义时的默认值替代
def <函数名>(<形式参数列表>,*args):
<函数体>
return <返回值列表>
def concat(*args,sep="/"):
return sep.join(args)
print(concat("www","lnu","edu","cn"))
print(concat("www","lnu","edu","cn",sep="."))
运行结果
www/lnu/edu/cn
www.lnu.edu.cn
def getSum(x1,x2,*x3):
total=x1+x2
for i in x3:
total+=i
return total
print(getSum(1,2))
print(getSum(1,2,3,4,5))
运行结果
3
15
2 函数的返回值
函数的返回值
- 无返回值、单一返回值和多返回值。
- 返回值可以是任何数据类型。
- return <表达式>语句用于退出函数,将表达式值作为返回值传递给调用方。不带参数值的 return 语句返回 None, None表示没有实际意义的数据。
#单一返回值
def rectangle(x,y):
s=x*y
return s
print("area1=",rectangle(3,5))
area2=rectangle(8,9)
print("V=",area2*10)
#多返回值
def rectangle(x,y):
s=x*y
c=(x+y)*2
return s,c
#当return语句返回多个值时,这些值形成了一个元组数据类型,如(s,c)
print("area1=",rectangle(3,5)[0])
print("c=",rectangle(3,5)[1])
#无返回值
def rectangle(x,y):
s=x*y
c=(x+y)*2
print("area1=",s)
print("c=",c)
rectangle(3,5)
6.3 变量的作用域
变量的作用域
- 变量的作用域即变量起作用的范围,是 Python 程序设计中一个非常重要的问题。
- 变量可以分为局部变量和全局变量
- 局部变量指在函数内部定义的变量,仅在函数内部有效,当函数退出时变量将不再存在
- 全局变量指在函数之外定义的变量,在程序执行全过程有效
- 全局变量在函数内部使用时,需 提前使用保留字global声明
def rectangle(x,y):
s=x*y
c=(x+y)*2
return s,c
#s和c 是局部变量
print("area1=",rectangle(3,5)[0])
print("c=",rectangle(3,5)[1])
print("s=",s) #会报错,因s是函数的局部变量
h=10
def rectangle(x,y):
global h
#h 是全局变量
v=x*y*h
return v
print("v=",rectangle(3,5))
print("h=",h)
6.4 lambda函数
lambda函数(匿名函数)
- 格式: lambda <参数列表>:<lambda体>
- lambda是关键字声明,<参数列表>与函数的参数列表是一样的,但不需要小括号括起来,冒号后面是<lambda体>,lambda表达式的主要代码编写于lambda体内,类似于函数体。lambda体的函数只能用于定义简单的,能够在一行内表示的函数。
f=lambda x,y:x+y
print(f(10,20))
运行结果
30
综合实例
【例6-1】 编写程序,为Mike和Tom输出生日歌
#E6-1.py
def happyA ():
print("Happy Birthday to you!")
def happyB(name):
happyA()
happyA()
print("Happy birthda,dear{}!".format(name))
happyA()
happyB("Mike")
print()
happyB("Tom")
6.5 time库
time库
- time库是Python提供的处理时间标准库
- time库提供系统级精确计时器的计时功能,可以用来分析程序性能,也可让程序暂停运行时间
- 使用time库需要用import保留字,最基本的使用方式如下:
>>> import time
>>> time.localtime( )#当地时间,已自动转化为北京时间
time.struct_time(tm_year=2020, tm_mon=4, tm_mday=17, tm_hour=17,
tm_min=59, tm_sec=13, tm_wday=4, tm_yday=108, tm_isdst=0)
>>> t=time.localtime()
>>> t.tm_mon
4
>>> t.tm_mday
17
综合实例
【例6-2】 编写程序,为Mike输出生日歌
#E6-2.py
import time
def happyA ():
print("Happy Birthday to you!")
def happyB(name):
happyA()
happyA()
print("Happy birthda,dear{}!".format(name))
happyA()
t=time.localtime()
if t.tm_mon==4 and t.tm_mday==22:
happyB("Mike")
time库——时间处理功能
- time库的功能主要包括:时间处理、时间格式化和计时
- 时间处理:time.time()、time.localtime()、time.gmtime()、time.ctime()
- 使用time.time()获取当前时间戳
- 所谓时间戳,即从格林威治时间1970年01月01日00分00秒(北京时间1970年01月01日08时00分00秒)起至现在的总秒数
>>>time.time()
1587117085.4883282
- 使用time. gmtime()获取当前时间戳对应的struct_ time对象
- 元组struct_time是一类对象,在Python中定义了一个元组struct_time将所有这些变量组合在一起,包括:4位数年、月、日、小时、分钟、秒等
序号 | 属性 | 值 |
---|---|---|
0 | tm_year | 4位年份 |
1 | tm_mon | 月 |
2 | tm_mday | 日 |
3 | tm_hour | 小时 |
4 | tm_min | 分钟 |
5 | tm_sec | 秒 |
6 | tm_wday | 一周第几日 |
7 | tm_yday | 一年第几日 |
8 | tm_isdst | 是否是夏令时 |
>>>time.gmtime()
time.struct_time(tm_year=2020, tm_mon=4, tm_mday=17,
tm_hour=9, tm_min=59, tm_sec=19, tm_wday=4,
tm_yday=108, tm_isdst=0)
>>> time.gmtime(1516939876.623)
time.struct_time(tm_year=2018, tm_mon=1, tm_mday=26,
tm_hour=4, tm_min=11, tm_sec=16, tm_wday=4,
tm_yday=26, tm_isdst=0)
- 使用time. localtime()获取当前时间戳对应的 本地时间的struct_ time对象
>>> import time
>>> time.localtime()
time.struct_time(tm_year=2020, tm_mon=4, tm_mday=22, tm_hour=11, tm_min=29,
tm_sec=24, tm_wday=2, tm_yday=113, tm_isdst=0)
>>> time.gmtime()
time.struct_time(tm_year=2020, tm_mon=4, tm_mday=22, tm_hour=3, tm_min=29,
tm_sec=28, tm_wday=2, tm_yday=113, tm_isdst=0)
- 使用time.ctime()获取当前时间戳对应的本地时间(北京时间),并转换为易读字符串
>>>time.ctime( now) #now可省略
'Fri Apr 17 18:02:12 2020'
>>> time.ctime(1500001234.32)
'Fri Jul 14 11:00:34 2017'
time库——时间 格式化功能
- 使用time.mktime()、time.strftime()、time.strptime()进行时间格式化
- 使用time.mktime(t)将struct_time对象t转换为时间戳,注意t代表当地时间
>>>t=time.localtime()
>>>time.mktime(t)
1566987981.0
>>>time.ctime(time.mktime(t))
'Wed Aug 28 18:26:21 2019'
- 使用time.strftime() 是时间格式化最有效的方法,可以通过多种通用格式输出时间。该方法利用一个格式字符串,对时间格式进行表示
>>>t=time.localtime()
>>> time.strftime("%Y-%m-%d %H:%M:%S",t) #注意大小写
'2020-04-22 10:57:24'
>>> time.strftime("%H:%M:%S %Y-%m-%d",t)
'10:59:05 2020-04-22'
>>> time.strftime("%m-%d-%Y %H:%M:%S ",t)
'04-22-2020 10:59:31 '
>>> time.strftime("%b %d %Y %H:%M:%S ",t)
'Apr 22 2020 11:43:31 '
- strptime()方法与strftime()方法正好相反,用于提取字符串中的时间来生成strut_time对象,可以很灵活地作为time模块的输入接口
>>>t='2020-04-17 18:10:01'
>>>time.strptime(t,"%Y - %m - %d %H:%M:%S")
time.struct_time(tm_year=2020, tm_mon=4, tm_mday=17, tm_hour=18,
tm_min=10, tm_sec=1, tm_wday=4, tm_yday=108, tm_isdst=-1)
综合实例
time库——计时
【例6-3】 编写程序,实现进度条功能
#E6-3.py
import time
def ptime():
t=time.localtime()
return time.strftime("%Y-%m-%d %H:%M:%S",t)
print("程序开始时间:",ptime())
for i in range(10):
print("■"*i, sep="", end="")
time.sleep(0.2)
print("\n下载完成")
print("程序结束时间:",ptime())
【试一试】 读程序,分析程序的运行功能
#E6-4.py
import time
lst = ["\\", "|", "/", "—"]
for i in range(20):
j = i % 4
print(lst[j], end="")
time.sleep(0.2)
课后作业
1.雨课堂平台发布的《第六章综合小练》
2.中国大学Mooc平台上的单元测试
网友评论