函数
概念
函数是组织好的,可重复使用的,用来实现单一,或相关联功能的代码段。
例如:
公司安排出差的过程如下,基本上流程是有一定规则的,我们可以抽象出来一个函数,我们只要根据不同的目的地,就可以达到相同的目的:
- 订往返票,目的地
- 坐车去出差地点
- 完成公司任务
- 坐车返回公司
定义及调用函数
使用def关键字定义一个函数,定义函数不会执行定义的代码,需要调用才会执行;
定义函数的规则:
●函数代码块以 def 关键词开头,后接函数标识符名称和圆括号()。
●任何传入参数和自变量必须放在圆括号中间。圆括号之间可以用于定义参数。
●函数的第一行语句可以选择性地使用文档字符串—用于存放函数说明。
●函数内容以冒号起始,并且缩进。
●return [表达式] 结束函数,选择性地返回一个值给调用方。不带表达式的return相当于返回 None。
def functionname( parameters ):
"函数_文档字符串"
function_suite
return [expression]
调用函数:functionname( parameters )
无返回值的函数
无返回值的函数就是return后面不加表达式,其实也可以省略return
#定义函数
def func():
print("这是一个函数")
#调用函数,方法名后面要加括号
func()
有返回值的函数
def add(a,b): # 形式参数,形参
"加法计算"
return a+b
n = add(1,2) # 实际参数1,2 实惨
print(n) # 3
匿名函数
匿名函数就是没有函数名字的函数,一般来说假如这个函数只用一次,就可以使用匿名函数
定义:
lambda [arg1 [,arg2,.....argn]]:expression
add = lambda a,b:a+b
print(add(1,2))
变量作用域
def func():
a = 20 # 定义在方法里面的变量,不能在方法外面访问
b = 2 # 方法外面的变量可以在方法里面被调用
def f1():
return b
print(f1())
以上实例输出结果:
2
参数
默认参数
调用函数时,默认参数的值如果没有传入,则被认为是默认值。
def person(name,age=18):
"打印人员信息"
print("name: ",name)
print("age: ",age)
return
person("张三")
person(name="张三",age=10)
以上实例输出结果:
name: 张三
age: 18
name: 张三
age: 10
关键字参数
指定参数名调用函数可调换顺序
def person(name,age):
"打印人员信息"
print("name: ",name)
print("age: ",age)
return
person(10,"张三")
person(age=10,name="张三")
以上实例输出结果:
name: 10
age: 张三
name: 张三
age: 10
不定长参数
需要一个函数能处理比当初声明时更多的参数。这些参数叫做不定长参数
定义:
def functionname([formal_args,] *var_args_tuple ):
"函数_文档字符串"
function_suite
return [expression]
加了星号*的参数会以元组(tuple)的形式导入,存放所有未命名的变量参数。
def person(*args):
"打印人员信息"
print(args)
return
person("张三","李四","王五")
以上实例输出结果:
('张三', '李四', '王五')
加了俩个星号**的参数会以字典的形式导入
# 传进来类似字典参数,调用参数等号左边的是key,右边的是value
def person(**kwargs):
print(kwargs)
return
person(name="张三")
person(name="张三", age=20)
以上实例输出结果:
{'name': '张三'}
{'name': '张三', 'age': 20}
练习
def person(*args,**kwargs):
"打印人员信息"
print(args)
print(kwargs)
for name in kwargs.items():
print(name)
return
person("张三","李四","王五",name1="哈哈",name2="呵呵")
以上实例输出结果:
('张三', '李四', '王五')
{'name1': '哈哈', 'name2': '呵呵'}
('name1', '哈哈')
('name2', '呵呵')
递归
递归就是函数调用自己,一定要设置退出条件,否则就是死循环
斐波那契数列指的是这样一个数列:
这个数列从第3项开始,每一项都等于前两项之和。
def feibonaqi(n):
if n == 1:
return 0
if n == 2:
return 1
return feibonaqi(n-1)+feibonaqi(n-2) #feibonaqi(n-1)代表前一个数字 feibonaqi(n-2)代表前前个数字
print(feibonaqi(5))
以上实例输出结果:
3
闭包
闭包=函数+引用环境
在函数里面再定义一个函数并返回该函数,并且这个函数引用了外面的变量,那么这个函数叫做闭包
def bibao(num1):
print(num1)
def inner(num2):
print(num2)
return inner # 返回的是一个函数体
a = bibao(3) # a = inner函数体 bibao方法里面做了一次打印 3
a(4) # a(4) = inner(4) inner函数里面执行了一句打印 4
a 其实指向的是函数inner,所以能在调用a(4)
闭包的实际应用
比如我们初中学的一元一次方程,y=ax+b,a,b是已知的,那么我们只要给一个x的值就能求y
def yiyuanyici(a,b):
def qiu_y(x):
print(a*x+b)
return qiu_y
line1 = yiyuanyici(2,3)
line1(2)
以上实例输出结果:
7
时间和日期函数
时间函数
延时等待
import time
print("1111")
time.sleep(3) # 执行完打印第一句“1111”后,延时3秒,再执行打印第二句“2222”
print("2222")
获取当前时间戳
import time
print(time.time())
print(time.localtime())
以上实例输出结果:
1639932809.211224
time.struct_time(tm_year=2021, tm_mon=12, tm_mday=20, tm_hour=0, tm_min=53, tm_sec=29, tm_wday=0, tm_yday=354, tm_isdst=0)
格式化时间
import time
print(time.strftime("%Y-%m-%d %H:%M:%S",time.localtime()))
以上实例输出结果:
2021-12-20 00-53-29
日期函数
获取当天的日期
from datetime import datetime
# 获取当前时间
print(datetime.now())
# 获取当前 年份
print(datetime.now().year)
# 获取当前 月份
print(datetime.now().month)
# 获取当前 日期
print(datetime.now().day)
# 获取今天星期几
print(datetime.now().weekday())
from datetime import datetimes,timedelta
# 获取当天的周一的日期
Monday = datetime.today()-timedelta(datetime.now().weekday())
print(Monday)
# 获取当天的周日的日期
Sunday = datetime.today()+timedelta(6-datetime.now().weekday())
print(Sunday)
# 格式化时间
print(Sunday.strftime("%Y-%m-%d"))
日历模块
import datetime
import calendar
# 获取年份
year = datetime.datetime.now().year
print(year)
# 获取月份
month = datetime.datetime.now().month
print(month)
# 获取月份的日期范围
dayRange = calendar.monthrange(year,month)
print(dayRange)
firstMonthDay = datetime.date(year,month,1)
print(firstMonthDay)
lastMonthDay = datetime.date(year,month,dayRange[1])
print(lastMonthDay)
文件读写及文件目录操作
创建、读写文件
# 读文件
with open("test.text") as newFile:
a = newFile.read()
print(a)
# w模式每次写都是清空
with open("test.text",mode="w") as newFile:
newFile.write("你好")
# a模式在文件末尾加数据
with open("test.text", mode="a") as newFile:
newFile.write("\n你好")
创建、删除目录
创建目录
import os
path = "./hehe/haha"
os.makedirs(path) #如果目录已经存在则会报错
import os
path = "./hehe/haha"
os.makedirs(path,exist_ok = True) #如果目录已经存在不会报错
删除文件、目录
删除文件
import os
path = "./hehe/haha"
os.remove(path+'/a.txt') # 如果被删除的文件不存在会报错
删除目录
import os
os.rmdir('./hehe') # 如果该文件夹下面还有文件或文件夹,则会抛错
获取文件路径
import os
path = './hehe/heihei/a.txt'
base = os.path.basename(path) # 获取文件名
dir = os.path.dirname(path) # 获取路径
print(base)
print(dir)
判断文件或文件夹
import os
print(os.path.isfile("a.txt")) #判断是否是文件
print(os.path.isfile("./hehe"))
print(os.path.isdir("./hehe")) #判断是否是文件夹
遍历目录
import os
path = './hehe'
for root,dirs,files in os.walk(path,topdown=False):
print(root)
print(dirs)
print(files)
print('--------------')
print("***********")