Task4 python函数与文件相关操作
Task4 python函数与文件相关操作
函数
1)函数关键字:以 def 关键词开头。
2)函数的定义:函数是编码好的,可以重复调用的,用来实现一定功能的代码段。
3)函数参数与作用域:位置参数,关键字参数,默认参数,不定长参数(范例六、七、八);函数作用域,包括内建作用域,全局作用域,局部作用域,以及闭包函数外的函数中(范例三-A、B、C)
4)函数返回值:return [表达式] 结束函数,选择性地返回一个值给调用方。不带表达式的return相当于返回 None。(范例九)
5)file:打开文件方式(读写两种方式)、文件对象的操作方法、学习对excel及csv文件操作
6)os模块
7)datetime模块(范例二)
范例一:修改字符串
# coding:utf-8
def filterchar(string):'''功能:过滤危险字符,并将过滤后的结果输出string:要过滤的字符串无返回值'''import re#缩进的重要性,不缩进会显示string没有被定义pattern = '黑客' #一直没办法解决一次替换多个关键词的功能sub = re.sub(pattern,"@@@@",string)print(sub)about = '我是黑客,喜欢黑客监听,哈哈哈,不怕犯错误!'
filterchar(about)
结果
我是@@@@,喜欢@@@@监听,哈哈哈,不怕犯错误!
范例二:输出每日一句:datetime的使用方法
def function_tips():'''功能:每天输出一条励志话'''import datetime# 定义一个列表mot = ["今天周一:\n我最牛逼。","今天周二:\n我最牛逼。","今天周三:\n我最牛逼。","今天周四:\n我最牛逼。","今天周五:\n我最牛逼。","今天周六:\n我最牛逼。","今天周日:\n我最牛逼。"]day = datetime.datetime.now().weekday()#获取当前星期print(mot[day])#输出每日一贴function_tips()
运行结果
今天周四:
我最牛逼。
范例三-A:输入参数的可变不可变性,数值,字符串,元组,列表
#可变不可变参数
def demo(obj):print("原值:",obj)obj += obj
#调用函数
print("="*10,"值传递","="*10)#形式参数的值不变
mot = "你是傻逼!"#字符串不可变
print("函数调用前:",mot)
demo(mot) #调用函数
print("函数调用后:",mot)print("="*10,"引用传递","="*10)#形式参数的值会改变
list1 = ["一","二","三","四"]#列表可变
print("函数调用前:",list1)
demo(list1) #调用函数
print("函数调用后:",list1)#执行了obj += obj的过程
结果
========== 值传递 ==========
函数调用前: 你是傻逼!
原值: 你是傻逼!
函数调用后: 你是傻逼!
========== 引用传递 ==========
函数调用前: ['一', '二', '三', '四']
原值: ['一', '二', '三', '四']
函数调用后: ['一', '二', '三', '四', '一', '二', '三', '四']
范例三-B:对于函数内部设置的局部变量可以通过添加一行(global 变量名称)实现将其从函数内部扩展到全局的功能,但是不可与输入参数的名称相同。
#这段程序主要是函数内部的变量和外部变量的一个关系,涉及到函数操作之后对输入参数的影响
def demo(obj):print("原值:",obj)
# obj = 9 #创建了函数内部的局部变量,已经与原始的输入参数无关,但决定下一步的操作对象,但是该操作对实际的操作是没有意义的obj += obj
# obj = 9 #创建了函数内部的局部变量,已经与原始的输入参数无关,对比上上一行的赋值对函数操作的影响return obj
#调用函数
print("="*10,"值传递","="*10)#形式参数的值不变
mot = "你是傻逼!"#字符串不可变
print("函数调用前:",mot)
aa = demo(mot) #调用函数
print("函数调用后:",mot)
print(aa)print("="*10,"引用传递","="*10)#形式参数的值会改变
list1 = ["一","二","三","四"]#列表可变
print("函数调用前:",list1)
aa = demo(list1) #调用函数
print("函数调用后:",list1)#执行了obj += obj的过程
print(aa)
结果
========== 值传递 ==========
函数调用前: 你是傻逼!
原值: 你是傻逼!
函数调用后: 你是傻逼!
你是傻逼!你是傻逼!
========== 引用传递 ==========
函数调用前: ['一', '二', '三', '四']
原值: ['一', '二', '三', '四']
函数调用后: ['一', '二', '三', '四', '一', '二', '三', '四']
['一', '二', '三', '四', '一', '二', '三', '四']
范例三-C:作用域的语句还包括nonlocal,用在嵌套函数的内部函数中,外部函数也可调用,但不拓展到全局
def middle():num1 = 1num = 11def outer():nonlocal num1num1 = 2print(num1) #num = 12def inner():nonlocal numnum = 13nonlocal num1num1 = 3print(num) #inner()print(num) #outer()print(num1) #print(num) #
middle()
运行
2
13
13
3
11
范例四:为函数输入参数设置默认值,以及位置参数和关键字参数输入法
#为函数输入参数设置默认值,以及位置参数和关键字参数输入法
def fun_bmi(per,hei,wei=60):#默认值必须放在所有参数最后的位置'''功能:计算BMIper:姓名hei:身高wei:体重'''print(per+"的身高:"+str(hei)+"米,体重:"+str(wei)+"千克")bmi = wei/(hei*hei)print("BMI指数为:"+str(bmi))if bmi < 18.5:print("瘦")elif bmi < 24.9:print("可以")elif bmi < 29.9:print("胖")else:print("太胖")fun_bmi("王子",1.73)#位置参数确定输入,采用默认值
fun_bmi(hei = 1.65,per = "李子")#关键字参数输入,可不按照位置关系输入,采用默认值
print(fun_bmi.__defaults__)#查看函数的默认值
输出
王子的身高:1.73米,体重:60千克
BMI指数为:20.04744562130375
可以
李子的身高:1.65米,体重:60千克
BMI指数为:22.03856749311295
可以
(60,)
范例五
def demo(obj=None): #定义函数并设置默认值,且默认值一定要指向不可变的参数if obj == None:obj = []print('obj的值:',obj)obj.append(1)
demo()
demo()def demo(obj=[]): #定义函数并设置默认值,默认值指向可变的参数会出现问题print('obj的值:',obj)obj.append(1)
demo()
demo()
结果
obj的值: []
obj的值: []
obj的值: []
obj的值: [1]
范例六:利用列表实现多个参数的输入
def coffee(*coffeename): #输出咖啡名称,利用*可以实现多个参数的输入print("\n我喜欢的咖啡有:")for item in coffeename:print(item) #输出咖啡名称
coffee("蓝山","卡布奇诺","巴西")
list1 = ["蓝山","卡布奇诺","巴西"]
coffee(*list1)
输出
我喜欢的咖啡有:
蓝山
卡布奇诺
巴西我喜欢的咖啡有:
蓝山
卡布奇诺
巴西
范例七:一个*设置可变参数设定,相当于按照位置接收参数,接受变量为列表
#一个*设置可变参数设定,相当于按照位置接收参数,接受变量为列表
def fun_bmi(*per):#可变参数'''功能:计算BMI(升级)per:姓名hei:身高wei:体重'''for list_per in per:for item in list_per:per = item[0]hei = item[1]wei = item[2]print(per+"的身高:"+str(hei)+"米,体重:"+str(wei)+"千克")bmi = wei/(hei*hei)print("BMI指数为:"+str(bmi))if bmi < 18.5:print("瘦")elif bmi < 24.9:print("可以")elif bmi < 29.9:print("胖")else:print("太胖")list_w = [["王子",1.60,62],["李子",1.70,65],["白子",1.80,72],["日子",1.90,82]]
list_u = [["赵子",1.90,62],["想子",1.65,65],["顺子",1.85,72],["天子",1.63,82]]
fun_bmi(list_w,list_u)
运行
王子的身高:1.6米,体重:62千克
BMI指数为:24.218749999999996
可以
李子的身高:1.7米,体重:65千克
BMI指数为:22.49134948096886
可以
白子的身高:1.8米,体重:72千克
BMI指数为:22.22222222222222
可以
日子的身高:1.9米,体重:82千克
BMI指数为:22.714681440443215
可以
赵子的身高:1.9米,体重:62千克
BMI指数为:17.174515235457065
瘦
想子的身高:1.65米,体重:65千克
BMI指数为:23.875114784205696
可以
顺子的身高:1.85米,体重:72千克
BMI指数为:21.0372534696859
可以
天子的身高:1.63米,体重:82千克
BMI指数为:30.863035868869737
太胖
范例八:两个**设置可变参数,相当于按照关键字接受参数,变量为字典
#两个**设置可变参数,相当于按照关键字接受参数,变量为字典
def sign(**sign):print()for key,value in sign.items():#遍历字典print(key,"的星座是:",value)
#sign(李子='水瓶',王子='射手')
#sign(白子='水瓶',天子='射手',赵子='天蝎')
dict1 = {'李子':'水瓶','孩子':'射手','赵子':'天蝎','王子':'射手'}
sign(**dict1)
运行
李子 的星座是: 水瓶
孩子 的星座是: 射手
赵子 的星座是: 天蝎
王子 的星座是: 射手
范例九
#返回值的应用
def fun_checkout(money):'''功能:计算商品合计金额并进行折扣处理money:保存商品金额列表返回值:商品金额和折扣之后的金额'''money_old = sum(money) #计算合计金额money_new = money_oldif 500<=money_old<1000:#享受9折优惠money_new = '{:.2f}'.format(money_old * 0.9)elif 1000 <= money_old < 2000: # 享受9折优惠money_new = '{:.2f}'.format(money_old * 0.8)elif 2000 <= money_old < 3000: # 享受9折优惠money_new = '{:.2f}'.format(money_old * 0.7)elif 3000 <= money_old < 4000: # 享受9折优惠money_new = '{:.2f}'.format(money_old * 0.6)return money_old,money_new #返回总金额和折扣后的金额
print("\n开始结算……\n")
list_money = []
while True:inmoney = float(input("输入商品金额(输入0表示输入完毕):"))if int(inmoney) == 0:break #退出循环else:list_money.append(inmoney)money = fun_checkout(list_money)
print("合计金额:",money[0],"应付金额:",money[1])
运行
开始结算……输入商品金额(输入0表示输入完毕):123.36
输入商品金额(输入0表示输入完毕):2563.4
输入商品金额(输入0表示输入完毕):23.12
输入商品金额(输入0表示输入完毕):0
合计金额: 2709.88 应付金额: 1896.92
范例十:while True的用法
#while True的使用,猜数游戏
num_guess = 12
while True:a = int(input("输入一个数:"))if a == num_guess:print("对了!")break#添加一个break跳出循环elif a < num_guess:print("小了!")else:print("大了!")
# continue#有没有continue存在似乎不影响程序的运行
运行
输入一个数:11
小了!
输入一个数:25
大了!
输入一个数:12
对了!
范例十一
#利用while True实现的系统登陆
d = {'cheng':'abc'}#用户名,密码设定
num = 4#次数设定
while True:name = input('请输入您的用户名:')if name in d:breakelse:print('您输入的用户名不存在,请重新输入')
# continuewhile True:password = input('请输入您的密码:')num -= 1if num > 0 :if d[name] == password:print("登陆成功!")breakelse:print('您输入的密码不正确,还有%s次输入机会,请重新输入:' % str(num))elif num <= 0:print('登陆失败!')break
# continue#没用
运行
请输入您的用户名:de
您输入的用户名不存在,请重新输入
请输入您的用户名:cheng
请输入您的密码:li
您输入的密码不正确,还有3次输入机会,请重新输入:
请输入您的密码:abc
登陆成功!
范例十二:全局变量和局部变量
pinetree = "我是个松树"#全局变量
def fun_christmastree():'''功能:一个梦无返回值:return:'''pinetree = "变身圣诞树,@_@"#局部变量print(pinetree)
print("\n下雪了……")
print("="*15,"开始做梦……","="*15)
fun_christmastree()
print("="*15,"梦醒了……","="*15)
pinetree = "落满雪花,"+pinetree+"-_-"
print(pinetree)
运行
下雪了……
=============== 开始做梦…… ===============
变身圣诞树,@_@
=============== 梦醒了…… ===============
落满雪花,我是个松树-_-
范例十三:匿名函数
import math
r1 = 10
r2 = 5
result = lambda r1,r2:r1*r2*math.pi
print(result(r1,r2))
运行结果
157.07963267948966
文件相关操作
范例十四:文本文件读写,在文件的读操作中,读取之后指针会放到文档的最后,因此在一次的文件打开和关闭过程中,两次读操作,第二次不会读入内容
text1 = 'hello world!\n'
text2 = 'you are beautiful!'
lodo = 'C:/untitled/attempt path/my file.txt' #路径和名称放在一个文件夹
my_file = open(lodo,'w')
my_file.write(text1)
my_file.close()my_file = open(lodo,'a')
my_file.write(text2)
my_file.close()my_file = open(lodo,'r')
textr = my_file.read()
print(textr)
my_file.close()
运行
hello world!
you are beautiful!
范例十五:利用无限循环读取文本文件
file = open('my file.txt')
while True:text = file.readline()if not text:breakprint(text)
file.close()
运行
hello world!you are beautiful!
范例十六:导入xlrd模块进行表格文件的读取
import xlrd
# 文件名
name_excel = 'C:/untitled/read path/excel_re.csv'
# 打开execl
workbook = xlrd.open_workbook(name_excel)
# 输出Excel文件中所有sheet的名字
print(workbook.sheet_names())
# 根据sheet索引或者名称获取sheet内容
Data_sheet = workbook.sheets()[0] # 通过索引获取
# Data_sheet = workbook.sheet_by_index(0) # 通过索引获取
# Data_sheet = workbook.sheet_by_name(u'名称') # 通过名称获取
print(Data_sheet.name) # 获取sheet名称
rowNum = Data_sheet.nrows # sheet行数
colNum = Data_sheet.ncols # sheet列数
# 获取所有单元格的内容
list = []
for i in range(rowNum):rowlist = []for j in range(colNum):rowlist.append(Data_sheet.cell_value(i, j))list.append(rowlist)
# 输出所有单元格的内容
for i in range(rowNum):for j in range(colNum):print(list[i][j], '\t\t', end="")
print()
# 获取整行和整列的值(列表)
rows = Data_sheet.row_values(0) # 获取第一行内容
cols = Data_sheet.col_values(1) # 获取第二列内容
# print (rows)
# print (cols)
# 获取单元格内容
cell_A1 = Data_sheet.cell(0, 0).value
cell_B1 = Data_sheet.row(0)[1].value # 使用行索引
cell_C1 = Data_sheet.cell(0, 2).value
cell_D2 = Data_sheet.col(3)[0].value # 使用列索引
print(cell_A1, cell_B1, cell_C1, cell_D2)
# 获取单元格内容的数据类型
# ctype:0 empty,1 string, 2 number, 3 date, 4 boolean, 5 error
print('cell(0,0)数据类型:', Data_sheet.cell(0, 0).ctype)
print('cell(1,0)数据类型:', Data_sheet.cell(1, 0).ctype)
print('cell(1,1)数据类型:', Data_sheet.cell(1, 1).ctype)
print('cell(1,2)数据类型:', Data_sheet.cell(1, 2).ctype)
# 获取单元格内容为日期的数据
date_value = xlrd.xldate_as_tuple(Data_sheet.cell_value(1,0),workbook.datemode)
print(type(date_value), date_value)
print('%d:%d:%d' % (date_value[0:3]))
运行
loading
范例十七:导入xlwt模块进行表格文件的生成
import xlwt
def set_style(name, height, bold=False):style = xlwt.XFStyle() # 初始化样式font = xlwt.Font() # 为样式创建字体font.name = namefont.bold = boldfont.color_index = 4font.height = heightstyle.font = fontreturn style
def write_excel(path):# 创建工作簿workbook = xlwt.Workbook(encoding='utf-8')# 创建sheetdata_sheet = workbook.add_sheet('demo')row0 = [u'字段名称', u'大致时段', 'CRNTI', 'CELL-ID']row1 = [u'测试', '15:50:33-15:52:14', 22706, 4190202]# 生成第一行和第二行for i in range(len(row0)):data_sheet.write(0, i, row0[i], set_style('Times New Roman', 220, True))data_sheet.write(1, i, row1[i], set_style('Times New Roman', 220, True))# 保存文件# workbook.save('demo.xls')workbook.save(path)
if __name__ == '__main__':# 设置文件名path = 'C:/untitled/read path/excel_re.csv'write_excel(path)print(u'创建demo.xls文件成功')
运行
创建demo.xls文件成功
os模块
详细的os相关的操作:.html
范例十八(参考:.html):
#通过传入需要遍历的目录,列出目录下的所有文件并统计文件数,os提供的path模块能对目录非常灵活的操作。
'''
import os,sys
dir = 'C:/untitled/read path'
list = os.listdir(dir)
print(*list)
'''
import os,sys
def listdir(dir,file):file.write(dir + '\n')fielnum = 0list = os.listdir(dir) #列出目录下的所有文件和目录for line in list:filepath = os.path.join(dir,line)print(filepath)if os.path.isdir(filepath): #如果filepath是目录,则再列出该目录下的所有文件myfile.write(' ' + line + '\\'+'\n')for li in os.listdir(filepath):myfile.write(' '+li + '\n')fielnum = fielnum + 1elif os.path: #如果filepath是文件,直接列出文件名myfile.write(' '+line + '\n')fielnum = fielnum + 1myfile.write('all the file num is '+ str(fielnum))
dir = input('please input the path:')
myfile = open('C:/untitled/read path/list.txt','w')
listdir(dir,myfile)
myfile.close()
运行
please input the path:C:/untitled/read path
C:/untitled/read path\asd.docx
C:/untitled/read path\bsd.txt
C:/untitled/read path\csd.xlsx
C:/untitled/read path\dsd.bmp
C:/untitled/read path\list.txt
迭代(iter和next(还未完全搞懂))
list = list(range(1,5))
print(list)
it = iter(list)#注意此处不能将list用list(range(1,5))替换
print(it)
for x in list:print(x)
运行结果
[1, 2, 3, 4]
<list_iterator object at 0x00000271B1D5CBE0>
1
2
3
4
字典推导式
num = [1,2,3,4]
content = ['a','b','c','d']
dict1 = {i:j for i,j in zip(num,content)}
print(dict1)
运行结果
{1: 'a', 2: 'b', 3: 'c', 4: 'd'}
- rowid详细介绍
- mybatis一级缓存、二级缓存以及集成EnCache、Redis,避免脏读
- 智源社区AI周刊No.101:DeepMind推出AlphaTensor登Nature封面;stateof.ai发布AI情况报告...
- snmp协议与snmp++
- c语言中 #include < > 和include “ “的区别
- linux下开启、关闭、重启mysql服务命令
- Service Principal 介绍
- VSS使用技巧
- 针对ONION勒索病毒!如何关闭139端口及445端口等危险端口
- AT24C02驱动程序,【I2C串行总线】的组成及工作原理
- 基于BS的校园餐厅网上订餐系统
- 【TCP专题】TCP连接断开
- CLion 入门
- 前后端异地、接口如何联调呢
- (亲测可用)html5 file调用手机摄像头
- 最详细的SQL注入语句
- 推理题