python学习笔记-Day5
字符串格式化
# 字符串格式化之%占位符# a. 位置 s = 'i am %s age %d' % ('eason', 18) print(s)==> i am eason age 18 # 传入可迭代的对象,%占位符会根据迭代传入顺序给字符串赋值# b. 字典 s = 'i am %(name)s age %(age)d' % {'name':'eason','age':18} print(s)==> i am eason age 18 # 每一个%占位符会起一个名字,传入一个字典,将字典中%占位符名字的key对应的值传入# c. 浮点型 s = 'percent %.2f' % 99.97623 # 精确到两位小数点,并四舍五入后一位 print(s)==> percent 99.98# d.%显示 # 当格式化字符串时,出现了%s等占位符,需要使用%%才可以输出%(类似于转译) --无占位符时%显示 s = '99%' print(s) --有占位符时%显示 s = 'jack %s 99%%' % 'xx' # 如果使用%需要使用%转译 print(s)==> 99% jack xx 99%# e. 左右对齐 s = 'xxx|%(name)+10s|xxx' % {'name':'eason'} print(s) s = 'xxx|%(name)-10s|xxx' % {'name':'eason'} print(s)==> xxx| eason|xxx # 占位10字符,右对齐(+号) xxx|eason |xxx # 占位10字符,左对齐(-号)# f. unicode、8进制、16进制 s = 'unicode:%c oct:%o, hex:%x ' % (65, 15, 15) print(s)==> unicode:A oct:17, hex:f # 分别将值转为unicode,8进制,16进制
# 字符串格式化之format(字符串方法)# a. format的基本使用 s = 'num1:{0} num2:{0} num{1}'.format(123,456) # 位置可以复用 print(s)==> num1:123 num2:123 num456 # 注意字符串有三个需要格式化地方,而我们只传入两个,传入索引是可以被复用的 # b. 指定名字修改 s = 'name:{name:s} age:{age}'.format(name='eason', age=12) print(s) # 使用**迭代字典 s = 'name:{name:s} age:{age}'.format(**{'name':'eason', 'age':12}) print(s)==> name:eason age:12 name:eason age:12 # format不仅支持迭代字典方式,而且支持指定名字修改# c. 会根据传入类型不同自动去转换 s = 'i am {}, age {}, {}'.format('stenven', 18, 2.3) print(s)==> i am stenven, age 18, 2.3 # 不需要特定指定字符串类型或者Int或者浮点,传入时自动转换# d. 传入迭代列表 s = 'i am {}, age {}, {}'.format(*['stenven', 18, 2.3]) # 使用星号遍历字典每一项 print(s)==> i am stenven, age 18, 2.3 # 迭代列表# e. 取列表中的元素 s = 'i am {0[0]}, age {1[0]}, {0[2]}'.format(['stenven', 18, 2.3], [18,22]) # 使用星号遍历字典每一项 print(s)==> i am stenven, age 18, 2.3 # 当我们没有使用"*[列表]"时,列表会当成一个元素传入,而在format格式化中,也可以读取列表某个索引的位置
迭代器
# 概念:迭代器是访问集合元素的一种方式。 # 迭代器对象从集合的第一个元素开始访问,直到所有的元素被访问完结束。 # 迭代器只能往前不会后退,不过这也没什么,因为人们很少在迭代途中往后退。 # 另外,迭代器的一大优点是不要求事先准备好整个迭代过程中所有的元素。 # 迭代器仅仅在迭代到某个元素时才计算该元素,而在这之前或之后,元素可以不存在或者被销毁。这个特点使得它特别适合用于遍历一些巨大的或是无限的集合,比如几个G的文件 特点:1. 访问者不需要关心迭代器内部的结构,仅需通过next()方法不断去取下一个内容 2. 不能随机访问集合中的某个值 ,只能从头到尾依次访问 3. 访问到一半时不能往回退 4. 便于循环比较大的数据集合,节省内存# 用我自己简要理解就是: # 1. 迭代器是一个对象 # 2. 该对象不使用__next__方法不返回值
生成器
# 生成器基本概念:用普通的函数语法定义的迭代器# 取出2层嵌套列表生成器 li = [[1,2],[3,4],[5]] def fla(lis):for sublist in lis:for element in sublist:yield element# 既然生成器本身就是一个迭代器 f = fla(li) r1 = f.__next__() print(r1) r2 = f.__next__() print(r2) r3 = f.__next__() print(r3) r4 = f.__next__() print(r4) r5 = f.__next__() print(r5)==> 1 2 3 4 5# 进入函数迭代后,遇到了yield,返回了yield返回值,并在此冻结,在下一次被__next__调用的时候,继续从此开始
递归
# 递归,见递归。这是对“递归”最精简的定义 # 其实按照我的理解就是,在函数中调用自己,就是递归# 例1:斐波那契递归 def fib(n):if n <= 2:return 1else:return fib(n-1) + fib(n-2)r = fib(6) # 查看第六位斐波那契序列数字 print(r)# 例2:递归乘法 def f1(n):if n == 1:return 1return f1(n-1)*nr = f1(5) # 计算从1到5的阶乘 print(r)
JSON序列化
# json序列化 # json序列化4种方法:dumps、dump、loads、load# a. dumps序列化(将Python数据类型转为json格式) import json dic = {'k1':'v1'} print(dic,type(dic)) result = json.dumps(dic) print(result,type(result))==> {'k1': 'v1'} <class 'dict'> {"k1": "v1"} <class 'str'> # dumps 将字典序列化为字符串# b. loads反序列化 dic = json.loads(result) print(dic, type(dic))==> {'k1': 'v1'} <class 'dict'> # loads 将字符串反序列化为python字典格式# 通过json获得天气接口 import requestsresponse = requests.get('http://wthrcdn.etouch.cn/weather_mini?city=北京') response.encoding = 'utf-8'dic = json.loads(response.text) # loads 将字符串反序列化为python字典格式 print(dic) ==> {'data': {'wendu': '30', 'yesterday': {'low': '低温 19.... print(type(dic)) ==> <class 'dict'> # 为字典格式# dump与load方法同dumps与loads一样, li = [11,22,33] json.dump(li, open('db', 'w')) # 将列表序列化,并写入文件 li =json.load(open('db', 'r')) # 读取文件,并反序列化 print(li)==> [11, 22, 33]# 注意: # json.loads 或load 反序列化时,由于json对字符串解析原因,请一定要使用单引号括住双引号格式(例: ‘{“k1”:"v1"}’ ),否则json将会反序列化失败报错
pickle序列化
# pickle序列化# a. 序列化 import pickle li = [11,22,33] r = pickle.dumps(li) # 序列化 print(r)==> b'\x80\x03]q\x00(K\x0bK\x16K!e.' # 序列后会是一个字节码# b. 反序列化 result = pickle.loads(r) print(result)==> [11, 22, 33]# c. 对文件操作的序列化与反序列化 li = [11,22,33] pickle.dump(li, open('db','wb')) # pickle 需使用字节写入 ret = pickle.load(open('db','rb')) # 以字节方式读取 print(ret) ==> [11, 22, 33] # 注意: # 1. pickle序列化为字节码,同样反序列化也是将一个字节码转为本身类型 # 2. pickle与json序列化对比:pickle支持所有Python数据类型,而json仅支持部分Python数据类型,json可夸语言,而pickle仅支持Python,所以各有各的好处与坏处
time模块与datatime模块
# time模块 import time,datetime # a. 时间戳 print(time.time()) # 显示为从1970年1月1日0点开始到现在的秒数(1970年为Unix元年)==> 1465484260.5525756 # b. ctime方法(获取时间字符串格式) print(time.ctime()) # 系统现在时间的字符串格式 print(time.ctime(time.time()-86640)) # ctime可以传入时间戳参数,例如当前时间戳减去一天秒数==> Thu Jun 9 22:57:40 2016 # 现在时间字符串格式 Wed Jun 8 22:53:40 2016 # 减去一天时间字符串格式# c. gmtime方法(struct_time) print(time.gmtime())==> time.struct_time(tm_year=2016, tm_mon=6, tm_mday=9, tm_hour=15, tm_min=0, tm_sec=15, tm_wday=3, tm_yday=161, tm_isdst=0) ### gmtime会返回一个对象,找个对象叫做struct_time time_obj = time.gmtime() print(time_obj.tm_year, time_obj.tm_mon) print("{year}-{mon}".format(year=time_obj.tm_year, mon=time_obj.tm_mon))==> 2016 6 # gmtime可以通过以上方式调用使用 2016-6 # 同样我们可以配合使用format,输出自己想要的格式print(time.gmtime(time.time()-86640)) # 同样gmtime可以传入时间戳参数# 注意: gmtime默认返回的struct_time是格林威治时间# d. localtime print(time.localtime(time.time()-86640)) # 将时间戳转换成struct_time,但返回的本地时间==> time.struct_time(tm_year=2016, tm_mon=6, tm_mday=8, tm_hour=23, tm_min=21, tm_sec=24, tm_wday=2, tm_yday=160, tm_isdst=0) # 与gmtime一样返回struct_time格式,但是返回本地时间而不是格林威治时间# e. mktime(将struct_time格式转换为时间戳格式) print(time.mktime(time.localtime())) # 与time.localtime()功能相反,将struct_time格式转回城时间戳格式==> 1465485924.0# f. time.sleep() 程序睡眠 time.sleep(4) # 程序睡眠4s# g. strftime(将struct_time格式转换为指定的字符串格式) print(time.strftime("%Y-%m-%d %H:%M:%S",time.gmtime()) ) ==> 2016-06-09 15:30:32 # 注意gmtime和localtime区别使用# h. strptime(将字符串格式转换成struct_time格式) print(time.strptime("2016-01-28","%Y-%m-%d") )==> time.struct_time(tm_year=2016, tm_mon=1, tm_mday=28, tm_hour=0, tm_min=0, tm_sec=0, tm_wday=3, tm_yday=28, tm_isdst=-1)
# datetime模块# a. 输出当天字符串 print(datetime.date.today())==> 2016-06-09# b. 将时间戳转成日期格式 print(datetime.date.fromtimestamp(time.time()))==> 2016-06-09# c. 将现在时间转为struct_time格式 current_time = datetime.datetime.now() # print(current_time) #输出2016-01-26 19:04:30.335935 print(current_time.timetuple()) #返回struct_time格式==>2016-06-09 23:38:58.100283 time.struct_time(tm_year=2016, tm_mon=6, tm_mday=9, tm_hour=23, tm_min=38, tm_sec=58, tm_wday=3, tm_yday=161, tm_isdst=-1)# d. 使用datetime进行时间的加减 new_date = datetime.datetime.now() + datetime.timedelta(days=10) #比现在加10天 print(new_date)==> 2016-06-19 23:44:48.365317new_date = datetime.datetime.now() + datetime.timedelta(days=-10) #比现在减10天 print(new_date)==> 2016-05-30 23:44:48.365317new_date = datetime.datetime.now() + datetime.timedelta(hours=-10) #比现在减10小时 print(new_date)==> 2016-06-09 13:44:48.365317new_date = datetime.datetime.now() + datetime.timedelta(seconds=120) #比现在+120s print(new_date)==> 2016-06-09 23:46:48.365317# e. 修改时间 current_time = datetime.datetime.now() print(current_time.replace(2014,9,12)) # 输出2014-09-12 23:48:52.619287,返回当前时间,但指定的值将被替换==> 2014-09-12 23:48:52.619287# f. 时间前后的比较 current_time = datetime.datetime.now() # 当前时间 current2_time = current_time.replace(2014,9,12) # 替换14年9月份时间# 首先我们要知道,我们这两个变量并不是字符串格式,而是datetime格式 print(type(current_time))==> <class 'datetime.datetime'> print(current_time>current2_time) # ==> True print(current_time<current2_time) # ==> False# 时间格式是可以直接对比比较的
日志模块
# 日志模块 import logging# a. 初识 logging.warning("user [alex] attempted wrong password more than 3 times") logging.critical("server is down")==> WARNING:root:user [alex] attempted wrong password more than 3 times CRITICAL:root:server is down # 直接使用,默认打印到屏幕,并且默认还帮你补充了root用户# b. 日志级别 DEBUG、INFO、WARNING、ERROR、CRITICAL # 分别对应方法: logging.debug('debug') logging.info('info') logging.warning('warning') logging.error('error') logging.critical('critical')# c. 将日志不输出到屏幕,而是存入log文件 logging.basicConfig(filename='example.log',level=logging.INFO) # 指定log文件名,log级别 logging.debug('This message should go to the log file') logging.info('So should this') logging.warning('And this, too')# example.log == > INFO:root:So should this WARNING:root:And this, too # 因为我们日志级别为INFO,所以并没有将debug日志写入到日志文件# d. 日志中增加时间 logging.basicConfig(filename='example.log',level=logging.INFO, format='%(asctime)s %(message)s', datefmt='%m/%d/%Y %I:%M:%S %p') # 这里format参数中%(asctime)s 表示时间占位符 logging.warning('is when this event was logged.')# example.log ==> 06/10/2016 01:16:49 AM So should this 06/10/2016 01:16:49 AM And this, too
# logging进阶import logging#create logger # 刚刚我们默认输出日志中增加一个root, getLogger参数指定root那个位置索要显示的用户名也好或者你自定义标记 logger = logging.getLogger('TEST-LOG') # setLevel方法设定一个全局的日志级别 logger.setLevel(logging.DEBUG)# create console handler and set level to debug # 我要输出到哪里,决定权在handler # StreamHandler屏幕输出日志 ch = logging.StreamHandler() # setLevel 设置屏幕输出日志的级别(相对于全局,这就是一个局部日志级别) ch.setLevel(logging.DEBUG)# create file handler and set level to warning # FileHandler文件输出日志 fh = logging.FileHandler("access.log") # 同样,setLevel给我们文件输出日志也定义一个级别 fh.setLevel(logging.WARNING)# create formatter # 定义一个日志输出格式 formatter = logging.Formatter('%(asctime)s - %(name)s - %(levelname)s - %(message)s')# add formatter to ch and fh # 将上面定义好的日志输出格式分别赋予屏幕输出和文件输出 ch.setFormatter(formatter) fh.setFormatter(formatter)# add ch and fh to logger # 我们刚刚定义屏幕输出对象(ch)和文件输出对象(fh),相当于注册到logger中 logger.addHandler(ch) logger.addHandler(fh)# 'application' code # 打印日志 logger.debug('debug message') logger.info('info message') logger.warn('warn message') logger.error('error message') logger.critical('critical message')
转载于:https://www.cnblogs.com/coolking/p/5571838.html
python学习笔记-Day5相关推荐
- Python学习笔记 day5
Python学习笔记 day5 参考/引用资料: 1.file a.打开文件方式(读写两种方式) 缓冲 with语句 b.文件对象的操作方法 c.学习对excel及csv文件进行操作 读写excel ...
- Python学习笔记:Day5 编写web框架
前言 最近在学习深度学习,已经跑出了几个模型,但Pyhton的基础不够扎实,因此,开始补习Python了,大家都推荐廖雪峰的课程,因此,开始了学习,但光学有没有用,还要和大家讨论一下,因此,写下这些帖 ...
- Python学习笔记:Day 16 编写移动App
前言 最近在学习深度学习,已经跑出了几个模型,但Pyhton的基础不够扎实,因此,开始补习Python了,大家都推荐廖雪峰的课程,因此,开始了学习,但光学有没有用,还要和大家讨论一下,因此,写下这些帖 ...
- Python学习笔记:Day15 部署Web App
前言 最近在学习深度学习,已经跑出了几个模型,但Pyhton的基础不够扎实,因此,开始补习Python了,大家都推荐廖雪峰的课程,因此,开始了学习,但光学有没有用,还要和大家讨论一下,因此,写下这些帖 ...
- Python学习笔记:Day14 完成Web App
前言 最近在学习深度学习,已经跑出了几个模型,但Pyhton的基础不够扎实,因此,开始补习Python了,大家都推荐廖雪峰的课程,因此,开始了学习,但光学有没有用,还要和大家讨论一下,因此,写下这些帖 ...
- Python学习笔记:Day13 提升开发效率
前言 最近在学习深度学习,已经跑出了几个模型,但Pyhton的基础不够扎实,因此,开始补习Python了,大家都推荐廖雪峰的课程,因此,开始了学习,但光学有没有用,还要和大家讨论一下,因此,写下这些帖 ...
- Python学习笔记:Day 12 编写日志列表页
前言 最近在学习深度学习,已经跑出了几个模型,但Pyhton的基础不够扎实,因此,开始补习Python了,大家都推荐廖雪峰的课程,因此,开始了学习,但光学有没有用,还要和大家讨论一下,因此, 写下这些 ...
- Python学习笔记:Day11 编写日志创建页
前言 最近在学习深度学习,已经跑出了几个模型,但Pyhton的基础不够扎实,因此,开始补习Python了,大家都推荐廖雪峰的课程,因此,开始了学习,但光学有没有用,还要和大家讨论一下,因此,写下这些帖 ...
- Python学习笔记:Day 10 用户注册和登陆
前言 最近在学习深度学习,已经跑出了几个模型,但Pyhton的基础不够扎实,因此,开始补习Python了,大家都推荐廖雪峰的课程,因此,开始了学习,但光学有没有用,还要和大家讨论一下,因此,写下这些帖 ...
最新文章
- react native 报错:cannot read property 'length' of undefined
- CCNA认证指南note 01
- Jupyter Notebook 快速入门简易教程
- 【编程6】贪吃蛇游戏(python+pygame)
- 转《18个实时音视频开发中会用到开源项目》
- CentOS7 原生 yum 源修改为阿里 yum 源
- CSI笔记【11】:阵列信号处理及MATLAB实现(第2版)阅读随笔(三)
- 利用PyG实现社区检测经典算法ClusterNet
- Windows 下定制黑苹果 USB 驱动教程
- QLU ACM2018新生赛
- 工频风力发电储能逆变电路中的电流检测(霍尔电流传感器ACS712/CH701应用案例)
- 985大学计算机专业起薪,985名校毕业生有多值钱?看完这份大学毕业生薪酬榜你就知道了...
- Word-embeding 【paper】
- 全国互联电网调度管理规程(第一章__第九章)
- 基于 Metal 框架的 GPU 计算
- 【独行秀才】macOS Big Sur 11.5 正式版(20G71)原版镜像
- .net fileupload批量上传可删除_8uftp上传工具,8uftp上传工具的使用方法只需8步
- Manacher Algorithm马拉车算法详解
- 人工智能学习:PASCAL VOC数据集读取(6)
- Java读取Excel数据:基于Apache POI(一)
热门文章
- decide your linux OS is GUI or not
- VMware SDS 之一:什么是VSAN??
- 用Unity的Animation播放Animator动画Clip
- target-action设计模式--主要为Button的方法重写
- 解决centos6.4 启动dell omsa 失败
- 转摘:工厂方法模式(Factory Method Pattern)
- 印度软件水平和中国的程序员
- 如何在Ubuntu 14.10 上安装WordPress?
- mysql执行计划缓存在哪_怎么去看懂mysql的执行计划
- L1-044 稳赢-PAT团体程序设计天梯赛GPLT