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 = 1
    num = 11
    def outer():
        nonlocal num1
        num1 = 2
        print(num1)   #
        num = 12
        def inner():
            nonlocal num
            num = 13
            nonlocal num1
            num1 = 3
            print(num)  #
        inner()
        print(num)  #
    outer()
    print(num1)  #
    print(num)  #
middle()

运行

2
13
13
3
11

范例四:为函数输入参数设置默认值,以及位置参数和关键字参数输入法

#为函数输入参数设置默认值,以及位置参数和关键字参数输入法
def fun_bmi(per,hei,wei=60):#默认值必须放在所有参数最后的位置
    '''
    功能:计算BMI
    per:姓名
    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_old
    if 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:
        break
    else:
        print('您输入的用户名不存在,请重新输入')
#        continue

while True:
    password = input('请输入您的密码:')
    num -= 1
    if num > 0 :
        if d[name] == password:
            print("登陆成功!")
            break
        else:
            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:
        break
    print(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 = name
    font.bold = bold
    font.color_index = 4
    font.height = height
    style.font = font
    return style
def write_excel(path):
 # 创建工作簿
    workbook = xlwt.Workbook(encoding='utf-8')
 # 创建sheet
    data_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相关的操作:https://www.runoob.com/python3/python3-os-file-methods.html
范例十八(参考:https://www.cnblogs.com/yigehundan/p/6379586.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 = 0
    list = 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 + 1
        elif os.path:   #如果filepath是文件,直接列出文件名
            myfile.write('   '+line + '\n')
            fielnum = fielnum + 1
    myfile.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'}
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值