【第一回】---python基本数据类型
Ⅰ、字符串
a:字符串的join(方法)
import argparse if __name__ == '__main__': name = "hello" names = ','.join(name) print('Hello to %s'%(names)); >> Hello to h,e,l,l,o
Ⅱ、列表
def study_list(length): #36、带有参数的函数 l1 = [1,2,3,4,5,9.0] #37、创建列表,利用符号[] l2 = list(range(10,10+length)) #38、创建列表,也可以用list() l3[0]=99 #43、更新列表值 print('l2==l3么?',l2==l3) #44、更新l3后依旧等于l2,因为l3和l2本来就是一个对象,不过换了个名字 l4 = l2.copy() #45、复制一个l2给l4,copy()创建一个一模一样的列表 l4[0]=999 print('删除前',l4) del l4[0] #47、del语句进行删除列表值,在python中del可以删除所有的变量 l4.append(30) #48、给列表添加值 l4.extend(l1) #49、给列表追加一个序列多个值 print('添加l1后:',l4) l4.reverse() #50、列表反转 print('反转后:',l4) l4.sort() #51、sort()函数,将列表进行排序 print('排序后:',l4)
2)、从键盘输入列表:
scores = list(map(int, input("请输入每个士兵的分数:").strip().split(',')))
Ⅲ、元组
def study_tuple(length:int)->bool: #52、解释参数类型的函数创建,->为返回值类型 tuple1 = (1,2,3,4) #53、创建元组,利用()符号,元组的特性是不可以改变 tuple2 = tuple(range(10,10+length)) #54、利用tuple创建元组 print(tuple1.count(1)) #55、元组函数count(),用于输出某个值的数量 print(tuple1.index(1)) #56、元组函数index(),可以按照索引得到值 tuple1[0] = 9 #58、因为元组的不可改变性,所以该语句会出错 tuple3 = tuple1+tuple2 #60、元组虽然不可改变,但是可以通过+号进行合并为另一个元组 print(tuple3,id(tuple3))
Ⅳ、字典
def study_dict(): #学习python中的字典模型,字典是 键->值 的映射 dict1 = {1:'一',2:'二',3:'三',4:'四'} #61、以下为创建字典的3种方法 dict4 = dict([('One',1),('Two',2),('Three',3)]) dict5 = dict({1:'一',2:'二',3:'三',4:'四'}) dict1[1] = '壹' #65、修改字典内容 dict1[5] = '五' #66、添加字典 dict6 = dict1.copy() #68、字典的复制 dict6[1] = 'One' print(dict1,'<dict1------------dict6>',dict6) dict1.clear() #69、字典的清空 print(dict1) del dict1,dict2,dict3,dict4,dict5,dict6 #70、删除字典,也可以用del dict[key]的方式删除某个键
1):字典添加元素
a. Test[‘价格’] = 100 b. xx = {‘hhh’:‘gogogo’} Test.update(xx)
2):字典删除元素
a. del[aa[‘adress’]] b. vv = aa.pop(‘key名称’)
3):字典的遍历
for item in dict.items(): print(item)
Ⅴ、集合
def study_set(): #python中集合的学习,集合中不存在相等的值 set1 = set(['You','Are','Not','Beautiful']) #71、利用set()函数进行创建集合 set2 = {'You','Are','So','Beautiful'} #72、利用{}创建集合,创建空集合的时候不能用{},因为{}表示字典 set3 = set2.copy() #73、集合的复制 print(type(set1)) print(set1,set2) print(set1|set2) #74、集合或运算符,得到两个集合中所有元素 print(set1&set2) #75、集合与运算符,得到两个集合共同元素 print(set1^set2) #76、不同时包含于set1和set2的元素 print(set1-set2) #77、集合差运算,得到set1有,set2没有的元素 set1.add('Me too') #79、集合添加元素 print('is语句用法',set3==set2,set3 is set2,set1 is not set2) #80、is和is not语句,is语句用于判断对象是否一样,==判断值是否一样 set3.clear() #81、清空集合,集合变为空 print(set3) del set3
附加:bool类型 (Python中以下情况默认为False)
Ⅰ:为0的数字,包括0,0.0
Ⅱ:空字符串,包括’’, “”
Ⅲ:表示空值的None
Ⅳ:空集合,包括(),[],{} 其他的值都认为是True。
【第二回】---python函数
Ⅰ、迭代器、生成器、装饰器
1、迭代器:
a、可迭代对象:只要能iter(对象)的就是可迭代对象。如:list,truple,str,dict,set可以执行遍历都是可迭代对象。
备注:可迭代对象转换为迭代器,只需要执行iter(对象)即可
例1:输出一个列表list1,使用iter方法之后为一个迭代器
>>list1 = [1,2,3,4] >>print (iter(list1)) //生成的为迭代器 <list_iterator object at 0x0000027713494F28> >>print (next(list1)) //报错Error:TypeError: 'list' object is not an iterator
b、迭代器:可迭代对象并且能实现next(对象)叫迭代器
例1:输出一个列表list1,使用iter转换为迭代器,再执行next()方法
>>list1 = [1,2,3,4] >>iter1 = iter(list1) //转换为一个迭代器 >>print (next(iter1)) //输出第一个结果 1
2、生成器:生成器生成有两种方式,一种是列表生成式,一种为yield
a、yield,,在函数中可以先将yield想象成return
def foo(): print("starting........") while True: res = yield 4 print("res:",res) g = foo() print(next(g)) print("*"*20) print(next(g))
输出:
解析:(1)、如果没有yield,g = foo() 输出starting........,存在yield为生成器无结果输出,故g = foo()无结果输出
(2)、第一次遇到next(g)之后,函数开始执行,输出starting........。加上print,将函数结果yield 4返回,故print(next(g))输出前两行
(3)、输出20个*
(4)、第二次遇到next(g)之后,函数从yield之后开始执行,此时res的值已经返回,故输出的结果为none,print(next(g))将yield看作return,故再次打印输出4
例2:包子铺要做包子,如果一次性做1000个,可能存在卖不完浪费的情况,如果吃一个包子,你做一个包子,那么这就不会占用太多空间存储了。
def eat(): for i in range(1,10000): yield '包子'+str(i) e = eat() for i in range(200): next(e)
Ⅱ、递归函数
在一个函数里在调用这个函数本身
例1:从某个目录里面查找日志文件,如果里面的内容是目录,继续执行函数
import os, sys, datetime,re # nginx日志存放的路径 nginxLogPath="/opt/nginx-1.9.5/logs/" # 获取昨天的日期 yesterday = (datetime.date.today() + datetime.timedelta(days = -1)).strftime("%Y-%m-%d") # nginx启动的pid文件 PID = "/var/run/nginx.pid" def cutNginxLog(path): """ 切割nginx日志函数 :param path: 日志文件的第一级目录 :return: """ logList = os.listdir(path) # 判断传入的path是否是目录 for logName in logList: # 循环处理目录里面的文件 logAbsPath = os.path.join(path, logName) if os.path.isdir(logAbsPath): # 如果是目录,递归调用自己,继续处理 cutNginxLog(logAbsPath) else: # 如果是日志文件,就进行处理 # 分割日志 re_Num = re.compile(r'^[a-zA-Z]') # 判断日志文件是否是字母开头,如果是日期开头就不切割 if re_Num.search(logName): logNewName = yesterday + "_" + logName # 新日志文件名称列如:2018-11-8_access.log oldLogPath = os.path.join(path, logName) # 旧日志文件绝对路径 newLogPath = os.path.join(path, logNewName) # 新日志文件绝对路径 os.rename(oldLogPath, newLogPath) cmd = " kill -USR1 `cat %s` "% PID res = os.system(cmd) if res != 0: return "重新加载nginx失败" cutNginxLog(nginxLogPath)