【python学习】函数篇-初阶

什么是函数?

函数是组织好的,可重复使用的,用来实现单一或相关联功能的代码段,它能够提高应用的模块性和代码的重复利用率。

1 函数的定义和调用

Python定义函数使用def关键字,格式如下:

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

eg:

def printInfo():
    print('------------------------------------')
    print('         人生苦短,我用Python            ')
    print('------------------------------------')

定义了函数之后,想要让这些代码能够执行,需要调用函数。通过“函数名()” 即可完成调用。

# 调用刚才定义的函数
printInfo()

2 函数的参数

先看一段代码:

 def add2num():
	c = 11+22
	print(c)

这个函数计算的只是固定的两个数,没有什么意义。

如果希望定义的函数,可以计算任何两个数和,我们在定义函数的时候,让函数接收数据,这就是函数的参数。

例:

#a和b就是函数的参数(形参),调用的时候,可以传入任意两个数(实参)。
def add2num(a, b):
    c = a+b
print(c)

add2num(11, 22)  

在这里插入图片描述
函数在被调用时会将实参按照相应的位置依次传递给形参,也就是说将第一个实参传递给第一个形参,将第二个实参传递给第二个形参,以此类推。

2.1 关键字参数的传递

关键字参数的传递是通过“形参=实参”的格式将实参与形参相关联,将实参按照相应的关键字传递给形参。
在这里插入图片描述

2.2 默认参数

调用函数时,如果没有传递参数,则会使用默认参数。

def printinfo( name, age = 35 ):
	print("Name:", name)
	print("Age:", age)
printinfo(name="miki" )
printinfo(age=9,name="miki" )

在这里插入图片描述
注意:定义函数时,带有默认值的参数一定要位于参数列表的最后面。否则程序会报错。

2.3 不定长参数

有时可能需要一个函数能处理比当初声明时更多的参数,这些参数叫做不定长参数,声明时不会命名。

def functionname([formal_args,] *args, **kwargs):
  • 加了星号(*)的变量args会存放所有未命名的变量参数,args为元组;
  • 加**的变量kwargs会存放命名参数,即形如key=value的参数, kwargs为字典。

eg1:
在这里插入图片描述
在这里插入图片描述
eg2:
在这里插入图片描述
在这里插入图片描述
eg3:
在这里插入图片描述

在这里插入图片描述
eg4:
在这里插入图片描述
在这里插入图片描述
eg5:
在这里插入图片描述
在这里插入图片描述
运行结果显示报错,这是因为a,b分别已经在之前作为函数的两个形参名,所以这里用a=和b=不合适。


3 函数的返回值

在这里插入图片描述

4 函数的嵌套定义

在这里插入图片描述

5 作用域

  • 为了避免变量的名称发生冲突,所以Python引入了命名空间的概念。
  • 命名空间指的是名称到对象的映射,类似于字典,键名是变量的名字,值是变量的值。

命名空间是相互独立存在的,而且它们被安排在某个特定的层次,把这些层次结构组合起来就是作用域
在这里插入图片描述

6 global和nonlocal关键字

  • 修改函数中变量时,函数中使用global关键字用于申明变量为全局变量。

  • 修改闭包函数中变量时,使用nonlocal关键字申明变量为外层函数的变量。如果不使用nonlocal关键字,外层函数变量可读但不可修改。

eg:
在这里插入图片描述

7 递归函数

一个函数的内部可以调用其他函数。但是,如果一个函数在内部不调用其它的函数,而是自己本身的话,这个函数就是递归函数。

eg:求阶乘

def fn(n):
    if n==1:
        return 1
    return n*fn(n-1)
print(fn(5))

8 匿名函数

匿名函数就是没有名称的函数,也就是不再使用def语句定义的函数。如果要声明匿名函数,则需要使用lambda关键字,匿名函数的声明格式如下所示:

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

EG:
在这里插入图片描述

在这里插入图片描述
注意:
使用Lambda声明的匿名函数能接收任何数量的参数,可以返回一个或者多个值(多个值可以用元组、列表等方式)。

9 时间函数

在Python中,通常有如下几种方式表示时间:
(1)时间戳类型;
(2)格式化的时间字符串类型;
(3)时间元组类型(struct_time)。

通常来讲,时间戳表示的是从1970年1月1日00:00:00开始按秒计算的偏移量,返回浮点秒数。

import time  # 引入time模块
ticks = time.time()
print("当前时间戳为:", ticks)

我们可以使用time模块的strftime方法来格式化日期。

import time
# 格式化成2022-05-10 21:46:26形式
print(time.strftime("%Y-%m-%d %H:%M:%S", time.localtime()))

在这里插入图片描述
在这里插入图片描述
时间元组:
返回struct_time类型的函数主要有gmtime()、localtime()和strptime(),struct_time元组。
在这里插入图片描述
time.altzone
返回格林威治西部的夏令时地区的偏移秒数。如果该地区在格林威治东部会返回负值(如西欧,包括英国)。对夏令时启用地区才能使用。

import time
print(time.altzone)

time.asctime([tupletime])
接受时间元组并返回一个可读的形式为"Tue Dec 11 18:07:14 2008"(2008年12月11日 周二18时07分14秒)的24个字符的字符串。

import time
t = (2008, 12, 11, 18, 7, 14, 1, 48, 0)
print(time.asctime(t))
  

time.clock( )
用以浮点数计算的秒数返回当前的CPU时间。用来衡量不同程序的耗时,比time.time()更有用。

import time
t0 = time.clock( )
#do some thing
t1 = time.clock( )
print(t1-t0)

time.ctime([secs])
作用相当于asctime(localtime(secs)),未给参数相当于asctime()。把一个时间戳(按秒计算的浮点数)转化为time.asctime()的字符串形式

import time
print(time.ctime(time.time()))
#或可转化其他时候的时间戳

time.gmtime([secs])
接收时间辍(1970纪元后经过的浮点秒数)并返回格林威治天文时间下的时间元组t。

import time
print(time.gmtime())
print(time.gmtime().tm_hour)

time.localtime([secs])
接收时间辍(1970纪元后经过的浮点秒数)并返回当地时间下的时间元组t(t.tm_isdst可取0或1,取决于当地当时是不是夏令时)

import time
print(time.localtime())
print(time.localtime().tm_year)

time.mktime(tupletime)
接受时间元组并返回时间戳,精确到整数秒

import time
print(time.mktime(time.localtime()))

time.sleep(secs)
推迟调用线程的运行,secs指秒数。
time.strftime(fmt[,tupletime])
接收以时间元组,并返回以可读字符串表示的当地时间,格式由fmt决定。

import time
t = (2009, 2, 17, 17, 3, 38, 1, 48, 0)
print(time.strftime("%b %d %Y %H:%M:%S", t))  

time.strptime(str,fmt=‘%a %b %d %H:%M:%S %Y’)
根据fmt的格式把一个时间字符串解析为时间元组。

import time
struct_time = time.strptime("30 Nov 2020", "%d %b %Y")
print(struct_time)

time.time( )
返回当前时间的时间戳
time.tzset()
根据环境变量TZ重新初始化时间相关设置。

time.timezone
表示当地时区(未启动夏令时)距离格林威治的偏移秒数(>0,美洲;<=0大部分欧洲,亚洲,非洲)

import time
print(time.timezone) 

time.tzname
包含一对根据情况的不同而不同的字符串,分别是带夏令时的本地时区名称,和不带的。

import time
a = time.tzname[0]
b = a.encode('latin-1').decode('gbk')
print(b)

时间类型转化关系在这里插入图片描述

10 日历函数

calendar.calendar(year,m=3,w=2,l=1,c=6)
返回一个多行字符串格式的year年年历,m表示3个月一行,间隔距离为c。每日宽度间隔为w字符。每行长度为21* W+18+2* C。l是每星期行数。

import calendar
print(calendar.calendar(2022,m=3,w=2,l=1,c=6)) 

calendar. firstweekday()
返回当前每周起始日期的设置。默认情况下,首次载入caendar模块时返回0,即每周从星期一开始。

calendar.isleap(year)
判断year是否是闰年,如果是返回True,否则为false。

calendar.leapdays(y1,y2)
返回在Y1,Y2两年之间的闰年总数。

calendar.month(year,month,w=2,l=1)
返回一个多行字符串格式的year年month月日历,两行标题,一周一行。每日宽度间隔为w字符。每行的长度为7* w+6。l是每星期的行数。

calendar.monthcalendar(year,month)
返回一个整数的单层嵌套列表。每个子列表装载代表一个星期的整数。Year年month月外的日期都设为0;从周一开始。范围内的日子都由该月第几日表示,从1开始。

calendar.monthrange(year,month)
返回两个整数。第一个这个月的第一天是星期几,日从0(星期一)到6(星期日)。第二个是这个月的天数。

calendar.prcal(year,w=2,l=1,c=6)
相当于print(calendar.calendar(year,w,l,c))

calendar.setfirstweekday(weekday)
设置每周的起始日期码。0(星期一)到6(星期日)

calendar.prmonth(year,month,w=2,l=1)
相当于 print(calendar.monthcalendar(year,w,l,c))

calendar.timegm(tupletime)
和time.gmtime相反:接受一个6元时间元组形式,返回该时刻的时间戳(1970纪元后经过的浮点秒数)

calendar.weekday(year,month,day)
返回给定日期是周几。0(星期一)到6(星期日)

11 随机数函数

random.random()

用于生成一个0到1的随机符点数: 0 <= n < 1.0。

   import random
# 生成第一个随机数
print("random():", random.random())
# 生成第二个随机数
print("random():", random.random())

=========================================================

random.uniform(a,b)

返回a,b之间的随机浮点数,范围[a,b]或[a,b]取决 于四舍五入,a不一定要比b小。

   import random
print("random:",random.uniform(50,100))
print("random:",random.uniform(100,50))

=========================================================

random.randint(a,b)

返回a,b之间的整数,范围[a,b],注意:传入参数 必须是整数,a一定要比b小。

   import random
#生成的随机数n: 12 <= n <= 20
print(random.randint(12,20))

=========================================================

random.randrange([start], stop[, step])

返回有个区间内的整数,可以设置step。只能传入整数random.randrange(10, 100, 2),结果相当于从[10, 12, 14, 16, … 96, 98]序列中获取一个随机数。

=========================================================

random.choice(sequence)

从sequence(序列,是有序类型的)中随机获取一个元素。列表、元组、字符串都属于sequence。

random.randrange(10,100,2) 
#结果等效于
random.choice(range(10,100,2))

=========================================================

random.shuffle(x[,random])

用于将列表中的元素打乱顺序,俗称为洗牌。
在这里插入图片描述

random.sample(sequence,k)

从指定序列中随机获取k个元素作为一个片段返回
在这里插入图片描述


本次主要针对函数进行了讲解,包括函数的定义调用、函数的参数、函数的返回值、函数的嵌套、递归函数、匿名函数、日期时间函数和随机数函数。函数作为关联功能的代码段,可以很好的提高应用的模块性,希望读者能用好这些函数。

猜你喜欢

转载自blog.csdn.net/weixin_53306029/article/details/124696335