关闭

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

标签: python迭代语言
2311人阅读 评论(1) 收藏 举报
分类:

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

大多数的语言都提供了时间操作的相应类,诸如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));

结果:   20151120日 星期五

而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行判断字符串是否是可迭代对象 True78行判断list是否是可迭代对象 True79行判断字典是否是可迭代对象 True82行判断字典是否是迭代对象 False83行判断list是否是迭代对象 False84行判断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

这里写图片描述

0
0
查看评论

python时间处理之date

# -*- coding: utf-8 -*- from datetime import * import time # 1. date常用的类方法和类属性 #date对象所能表示的最大日期: 9999-12-31 print 'date.max',date.max #date对象...
  • wirelessqa
  • wirelessqa
  • 2012-09-12 23:18
  • 21329

王亟亟的Python学习之路(一)-环境搭建

轉載請注明出處王亟亟的大牛之路楼主因为正好对Python这门高级语言感兴趣,然后经过一定的学习,总结下一些经验和知识点,分享给大家,这一系列会由浅至深,因为本身就不是从业余Python相关开发纯粹兴趣,如有不对请提出,谢谢哈!言归正传,这篇讲下简单的环境搭建,百度其实也有,但是还要自己找资源,楼主在...
  • ddwhan0123
  • ddwhan0123
  • 2015-10-30 13:57
  • 1899

王亟亟的Python学习之路(10)-匿名函数

转载请注明出处:王亟亟的大牛之路又有好多天没有碰Python的东西了,下午抽出点时间就补一篇介绍匿名函数匿名函数在很多语言里都有,它可以使代码更加简洁、紧凑,模块化程度更高。在jdk8里发现了lambda表达式的影子以前我们要循环一个集合需要这样List<Integer> numbers...
  • ddwhan0123
  • ddwhan0123
  • 2016-03-14 16:40
  • 1613

王亟亟的Python学习之路(六)-递归,迭代,列表生成式

转载请注明出处:王亟亟的大牛之路最近事情比较多,也没什么时间学习。(借口,明明在偷懒) 难得空下来,就继续把文章写下去。(玩手游时间更多)在贴今天要写的内容之前还是先说一下某些概念!(概念还是很重要的,虽然更重要的是理解)什么是递归?(维基来的)白话的理解就是某函数自己调用自己大牛的分析: 递...
  • ddwhan0123
  • ddwhan0123
  • 2015-11-19 16:45
  • 2233

Python可迭代对象,迭代器,生成器的区别

本篇文章简单谈谈Python中可迭代对象,迭代器和生成器之间的关系。刚开始我认为这两者是等同的,但后来发现并不是这样;直接抛出结论: 可迭代对象包含迭代器。 如果一个对象拥有__iter__方法,其是可迭代对象;如果一个对象拥有next方法,其是迭代器。 定义可迭代对象,必须实现__iter__方法...
  • jinixin
  • jinixin
  • 2017-05-16 12:39
  • 1092

王亟亟的Python学习之路(10)-函数对象的作用域,函数作为返回值,闭包

转载请注明出处:王亟亟的大牛之路本来打算把工作的事周末做掉点,但是发现在外面浪并不能迅速集中投入,为了避免不必要的BUG 还是明天在家做吧,那么久写一篇Python的文章吧,毕竟背着Mac出门不做些太对不起自己的肩膀了废话不多,直接说内容,这篇文章的内容大致是围绕“闭包”走的,介绍下相关理论知识 ...
  • ddwhan0123
  • ddwhan0123
  • 2016-02-27 20:20
  • 3087

王亟亟的Python学习之路(九)-sorted()排序以及简单字符串处理

转载请注明出处:王亟亟的大牛之路这一片就讲2个知识点,1排序,2字符串处理Python在排序操作的这一部分做了很好的封装,我们不需要写太多代码就可以实现排序的效果,先贴下Java的实现。(这里不是黑Java!!!!)public class 直接插入排序 { public static voi...
  • ddwhan0123
  • ddwhan0123
  • 2016-02-12 12:39
  • 2416

王亟亟的Python学习之路(二)-项目创建以及要点提及

转载请注明出处王亟亟的大牛之路首先,说一下上一篇为什么虽说我们是从3.X开始说起,那就要说明下2个版本的区别(上下版本几乎没关系)Python的3​​.0版本,常被称为Python 3000,或简称Py3k。相对于Python的早期版本,这是一个较大的升级。为了不带入过多的累赘,Python 3.0...
  • ddwhan0123
  • ddwhan0123
  • 2015-10-30 15:13
  • 1584

王亟亟的Python学习之路(三)-基础语法以及基本数据类型

转载请注明出处:王亟亟的大牛之路理论知识虽然很枯燥,但是你以后的高度取决于你基础的厚度每种语言多多少少都有它的保留关键字 JAVA的: Python的: 那关键字是什么?电脑语言里事先定义的,有特别意义的标识符,有时又叫保留字,还有特别意义的变量。注释 java: -单行 // -多行...
  • ddwhan0123
  • ddwhan0123
  • 2015-10-30 16:49
  • 1501

王亟亟的Python学习之路(八)-函数式编程,map(),reduce(),filter()

转载请注明出处:王亟亟的大牛之路首先在这里祝愿大家,新年快乐,工作顺利,BUG少少!!!本来说是在春节假期内继续维持着写文章的进度,但是还是偷懒了几天(打了4天SC2哈哈哈)今天上的是关于Python的文章,毕竟在亲戚家拜年,懒得插各类手机调试什么的,况且确实好久没有弄Python了,就写了,废话不...
  • ddwhan0123
  • ddwhan0123
  • 2016-02-10 16:43
  • 1992
    个人资料
    • 访问:815564次
    • 积分:10546
    • 等级:
    • 排名:第1893名
    • 原创:211篇
    • 转载:5篇
    • 译文:6篇
    • 评论:938条
    博客专栏