函数
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'}