3.函数、文件操作

165 阅读6分钟

函数

概念

函数是组织好的,可重复使用的,用来实现单一,或相关联功能的代码段。

例如:

公司安排出差的过程如下,基本上流程是有一定规则的,我们可以抽象出来一个函数,我们只要根据不同的目的地,就可以达到相同的目的:

  1. 订往返票,目的地
  2. 坐车去出差地点
  3. 完成公司任务
  4. 坐车返回公司

定义及调用函数

使用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("***********")