王亟亟的Python学习之路(七)-date,continue,迭代对象,生成器

转载请注明出处:王亟亟的大牛之路

大多数的语言都提供了时间操作的相应类,诸如java的java.util.Datejava.util.Calendar等等,

Python中是timecalendar .

首先需要导包import time;

然后就可以使用了,mTime= time.time()那结果呢?

1448004021.1337154 (而且这个数字还继续在变)

WHY?

用ticks计时单位返回从12:00am, January 1, 1970(epoch) 开始的记录的当前操作系统时间,格林威治时间你懂的

在Java中也有类似实现,像下面:

Date date =new Date();
System.out.println(date.getTime());

结果:   1448004275140

那如何显示出我们平时的时分秒啊,日起之类的呢?

Java中的实现是:

 Date date =new Date();
 DateFormat df1 = DateFormat.getDateInstance(DateFormat.FULL, Locale.CHINA);
 System.out.println(df1.format(date));

结果:   2015年11月20日 星期五

而Python中:

localtime = time.localtime(time.time())
print("第107行,本地时间 :", localtime)
#时间格式化
print("第109行,打印格式化后的本地时间",time.asctime(localtime))

结果:   第107行,本地时间 : time.struct_time(tm_year=2015, tm_mon=11, tm_mday=20, tm_hour=15, tm_min=20, tm_sec=21, tm_wday=4, tm_yday=324, tm_isdst=0)
        第109行,打印格式化后的本地时间 Fri Nov 20 15:20:21 2015

Fri Nov 20 15:20:21 2015是不是看了就眼熟了?,那么107行打印的那一长串又是什么呢?

Python函数用一个元组装起来的9组数字处理时间,每个元素代表的意思依次为:

年,月,日,小时,分钟,秒一周第几天,一年第几天,是否夏令时

然后调用,time.asctime()方法把这个元素格式化为我们所更能理解的格式。

跟事件相关的还有Calendar,Python对日历进行了很好的一层封装,诸如我要打出某一年某一月的所有日历,只需要一行代码calendar.month(2015,11)

结果:

November 2015

Mo Tu We Th Fr Sa Su

1

2 3 4 5 6 7 8

9 10 11 12 13 14 15

16 17 18 19 20 21 22

23 24 25 26 27 28 29

30

是不是瞬间高能?

还有诸如 返回在两年之间的闰年总数。

print(calendar.leapdays(2000,2009),"年")

结果: 3年


Python continue 语句

continue 语句跳出本次循环,而break跳出整个循环意义和Java中差不多都是直接终端这一步操作回到循环的起始点,看例子:

for x in "HelloWorldhaha":
        if x=="r":
            continue
        print("now word:",x,end="   ")
        if x=="a":
            break

结果:   now word: H   now word: e   now word: l   now word: l   now word: o   now word: W   now word: o   now word: l   now word: d   now word: h   now word: a   NiHao    当前数字 0

第一个逻辑只是让r这一组打印没有执行,第二组逻辑的break是让整个循环结束了,所以二者的区别还是很大的没一个是单轮一个事全局哦。

再贴一个**pass**的例子
for x in range(10):
    if x%3==0:
        pass
        print("NiHao",end="    ")
    print("当前数字",x)

结果:
当前数字 1
当前数字 2
NiHao    当前数字 3
当前数字 4
当前数字 5
NiHao    当前数字 6
当前数字 7
当前数字 8
NiHao    当前数字 9

所以,pass就是 什么都没发生的意思。。


Python生成器

在Python中,这种一边循环一边计算的机制,称为生成器:generator。只要把一个列表生成式的[]改成(),就创建了一个generator。

print("第8行打印list",[x for x in range(10)])

结果:   第8行打印list [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]

//创建一个generator
print("第11行打印generator",(x for x in range(10))) 

结果:   第39行打印变形的fib <generator object fib at 0x000000F008E43AF0>

generator是无法被直接打印出来的,我们可以用next()函数把他一个一个读出来(也不可以获取他的长度)

一样的道理,我们可以用for循环等一些迭代的方法,把他里面的内容读出来

g=(x for x in range(10))
#可迭代
for x in g:
    print(x,end=" ")
结果:   0 1 2 3 4 5 6 7 8 9 

或者用
 next(g)
结果:   0

那么如果用next()读下去读不到东西了,就会抛异常,像这样

Traceback (most recent call last):

File “”, line 1, in

StopIteration

generator还提供了一个关键字yield,看上去 功能和return之类的差不多,但是运行到yield函数就会停止,并且记录位置,下一次调用会从 这个 位置 开始操作

def testYie():
    print("第一次执行到这里")
    yield 1
    print(‘第二次执行到这里‘)
    yield 3
    print(‘第三次执行到这里‘)
    yield 5
#需要先构造一个函数对象
newTestYie=testYie()

print(next(newTestYie))
print(next(newTestYie))
print(next(newTestYie))
yield必须在一个函数中,不可以出现在基类里。

结果:
第一次执行到这里
1
第二次执行到这里
3
第三次执行到这里
5

从正常理解结果看上去,函数只被调用了1次,其实并不是,被执行了3次才出现了这么个结果,每一次都是从关键字结束,第二次又从关键字的位置开始

如果再多调用一次,就会出现刚才的异常了

当一个函数 出现 yield 关键词的时候 这个 函数就是 generator函数了



迭代对象

迭代的概念以及如何在之前已经有讲过,今天要再强调的是Iterable对象以及Iterator对象

From Internet

一类是集合数据类型,如list、tuple、dict、set、str等;

一类是generator,包括生成器和带yield的generator function。

这些可以直接作用于for循环的对象统称为可迭代对象:Iterable。

可以被next()函数调用并不断返回下一个值的对象称为迭代器:Iterator。

我们可以用isinstance函数来判断对象的类型,如:

#判断是否是可迭代对象
print(‘第77行判断字符串是否是可迭代对象‘,isinstance("as",Iterable))
print(‘第78行判断list是否是可迭代对象‘,isinstance([],Iterable))
print(‘第79行判断字典是否是可迭代对象‘,isinstance({"aa":123,"cc":123},Iterable))

#判断是否迭代对象Iterator
print(‘第82行判断字典是否是迭代对象‘,isinstance({"aa":123,"cc":123},Iterator))
print(‘第83行判断list是否是迭代对象‘,isinstance([x for x in range(10)],Iterator))
print(‘第84行判断generator是否是迭代对象‘,isinstance((x for x in range(10)),Iterator))

结果:
第77行判断字符串是否是可迭代对象 True
第78行判断list是否是可迭代对象 True
第79行判断字典是否是可迭代对象 True

第82行判断字典是否是迭代对象 False
第83行判断list是否是迭代对象 False
第84行判断generator是否是迭代对象 True

两种类型还能互相转换:

#转换为Iterator对象
print(‘第87行Iterable转换为Iterator对象‘,isinstance(iter([x for x in range(10)]),Iterator))

第87行Iterable转换为Iterator对象 True

那么,有了Iterable为什么还需要Iterator呢?(好绕口,好难记)

这是因为Python的Iterator对象表示的是一个数据流,Iterator对象可以被next()函数调用并不断返回下一个数据,直到没有数据时抛出StopIteration错误。可以把这个数据流看做是一个有序序列,但我们却不能提前知道序列的长度,只能不断通过next()函数实现按需计算下一个数据,所以Iterator的计算是惰性的,只有在需要返回下一个数据时它才会计算。

Iterator甚至可以表示一个无限大的数据流,例如全体自然数。而使用list是永远不可能存储全体自然数的。

例子里还有个99乘法表和帕斯卡数列,更多例子可以直接看源码:

https://github.com/ddwhan0123/PythonExample/blob/master/%E7%A4%BA%E4%BE%8B/l5demo.py

Thanks

时间: 2024-10-06 07:33:13

王亟亟的Python学习之路(七)-date,continue,迭代对象,生成器的相关文章

Python学习之路-Day1-Python基础

Python学习之路第一天 学习内容: 1.Python简介 2.安装 3.第一个Python程序 4.变量 5.字符编码 6.用户输入 7.表达式if..else语句 8.表达式for语句 9.break和continue 10.while循环 11.字符串格式化 1.python简介 python的创始人为吉多·范罗苏姆(Guido van Rossum).1989年的圣诞节期间,吉多·范罗苏姆为了在阿姆斯特丹打发时间,决心开发一个新的脚本解释程序,作为ABC语言的一种继承. 最新的TIOB

Python学习之路

Python学习之路 目录 Python学习之路[第一篇]:流程控制,用户交互,语法要求,变量,字符,注释,模块导入的使用 Python学习之路[第二篇]:文件,字符串,列表,元组,字典,集合的使用 更新中...

Python学习之路-装饰器&生成器&正则表达式

装饰器 通俗的讲,装饰器就是在不改变源代码基础上,给源代码增加新功能. 不改变函数的源代码.调用方式.返回值等,给函数增加新功能. 经典案例:登录装饰器, def login_decorator(func):     def inner():         if USER_TEMP["status"] == False:             print("\033[31;1m用户未登录,请先登录\033[0m")             login_atm()

Python学习之路【第一篇】-Python简介和基础入门

1.Python简介 1.1 Python是什么 相信混迹IT界的很多朋友都知道,Python是近年来最火的一个热点,没有之一.从性质上来讲它和我们熟知的C.java.php等没有什么本质的区别,也是一种开发语言,而且已经进阶到主流的二十多种开发语言的top 5(数据源自最新的TIOBE排行榜). 来头不小啊!二十多种主流的开发语言,我该从哪一个开始呢?人生苦短,let‘s python! 1.2 Python的由来和发展趋势 Python的前世源自鼻祖“龟叔”.1989年,吉多·范罗苏姆(Gu

Python学习之路——强力推荐的Python学习资料

资料一:程序媛想事儿(Alexia)总结 Python是一种面向对象.直译式计算机程序设计语言.它的语法简捷和清晰,尽量使用无异义的英语单词,与其它大多数程序设计语言使用大括号不一样,它使用縮进来定义语句块.与Scheme.Ruby.Perl.Tcl等动态语言一样,Python具备垃圾回收功能,能够自动管理内存使用.它经常被当作脚本语言用于处理系统管理任务和网络程序编写,然而它也非常适合完成各种高级任务. Python上手虽然容易,但与其它任何语言一样要学好Python并非一日之功.我的Pyth

Python学习之路 001

Python学习之路 从今天起开始写Python学习的经历了,哈哈. 了解Python是在我想入坑Linux运维这条路开始的. 我是计算机出身有着一定编程的功底,刚开始接触Python的时候觉得Python我学习过的c,c++特性完全不一样.觉得为什么这东西会这么智能 就拿Hello World来说 C: 1 #include<stdio.h> 2 3 void main() 4 { 5 printf("Hello World"); 6 } C++: 1 #include&

Python 学习之路(二)

Python 学习之路(二) 以下所用的是Python 3.6 一.条件语句 简单判断 1 if 判断条件: 2 执行语句-- 3 else: 4 执行语句-- 复杂判断 1 if 判断条件1: 2 执行语句1-- 3 elif 判断条件2: 4 执行语句2-- 5 elif 判断条件3: 6 执行语句3-- 7 else: 8 执行语句4-- 二.循环语句 2.1 while语句 和其他语言一样,不同的是多了else语句.在 python 中,while - else 在循环条件为 false

Python 学习之路(三)

Python 学习之路(三) 以下所用的是Python 3.6 一.集合部分 集合是一个无序的,不重复的数据集合,主要用来去重,以及关系测试:交集,差集,并集等 1.1 关系操作 1.1.1 列表去重 可以给列表去重,例如: 1 set_demo = [1,2,3,4,5,3,2,1] # 列表 2 set_demo = set(set_demo) # 转换成集合,来去重 3 print(set_demo) 1.1.2 取交集 intersection()方法 可以获得两个集合的交集部分,例如:

Python学习之路(第一周)

走上软件开发之路已经三个年头.我本人是android原生开发出生.期间由于工作的需要以及开发的趋势发展,也走上混合开发的道路,现在主要运用ionic框架进行移动端app的开发.但是未来的互联网发展趋势还是大数据+人工智能.所以现在学习Python就很有必要.这里就不介绍Python语言的优劣了,想具体了解的小伙伴可以自行度娘吧. 好了,直接步入正题. 本博客主要记录自己接下来几个月的Python学习之路,能力有限,期间有什么表达不对的欢迎大家留言区批评指正! Python版本:Python3.5

Python学习之路—2018/6/14

Python学习之路-2018/6/14 1.浏览器与服务器 浏览器向服务器发送请求的过程为请求过程,服务器向浏览器响应的过程为响应过程. 2.简单的web应用程序 import socket sock = socket.socket() sock.bind(("100.113.14.43", 8080)) sock.listen(5) with open("index.html", "r") as f: # 先将样式写入html文件中,然后再读