python自学笔记(3)--python基本语句

来源:互联网 发布:java不合法的标识符 编辑:程序博客网 时间:2024/05/19 20:38

python自学笔记(3)--python基本语句


if语句

所有python对象都支持比较操作,可以用于测试相等性,相对大小等。如果是复合对象,python会检查其所有部分,包括自动遍历各级嵌套对象,直到可以得出最后结论。

测试操作符
“==”操作符测试值的相等性
“is”表达式测试对象的一致性
Python中不同类型的比较:
数字:通过相对大小进行比较
字符串:按照字典次序逐字符进行比较
列表和元组:自左至右比较各部分内容
字典:对排序之后的(键,值)列表进行比较
Python中的真假的含义
非零数字为真,否则为假
非空对象为真,否则为假
None始终为假

if语句格式如下,前面的关键字需要对齐,elif是可选的:

d1 = 4d2 = 5if d1 > d2:    print("d1 > d2")elif d1 < d2:    print('d1 < d2')#结果else:    print('d1 == d2')



if的一种三元表达式
A = X if Y else Z  等同于
if Y:
A = X
else:
A = Z

A = 7B = 9maxx = A if A > B else Bprint(maxx)#9


while循环
用于通用迭代结构,即为非迭代式的。while可以跟else语句在后面,else代码块只有在循环正常终止时才会执行,如果被break打断,就不会执行else语句。
a = 0while a < 5:#跟a<3时的else是否执行的结果是不同的    print(str(a) + 'd')    a += 1    if a > 4:        breakelse:    print("while finished. ")

for循环
一个通用的序列迭代器,用于遍历任何有序的序列对象内的元素。可用于字符串,元组,列表和其他内置可迭代对象,以及通过类所创建的新对象。for循环比比while效率更高。

P.S.Python中也提供了一些能够进行隐形迭代的工具:
in成员关系测试
列表解析
map,reduce和filter函数

P.S.xrange和range的区别(python3.x里面,range就是xrange了,3.x直接使用range即可)在于,range直接在内存中生成一个序列,二xrange是用到一个生成一个,所以xrange能够更好的节约内存,尤其是生成大的序列的时候。

try语句

file_name = input("please input file name to open:") try:    f = open(file_name,"rt")     print("file content is:\n")    for eachline in f:        print(eachline)    f.close()except FileNotFoundError as reason1:    print("file not found: " + str(reason1))#file not found: [Errno 2] No such file or directory: 'filenametest'else:    print('未报异常时,可以执行else语句,报异常的话就不执行else语句')finally:    print("无论是否出现异常都会执行执行此句")

使用raise语句可以主动抛出一个异常。


With语句的使用
With语句是什么?
有一些任务,可能事先需要设置,事后做清理工作。对于这种场景,Python的with语句提供了一种非常方便的处理方式。一个很好的例子是文件处理,你需要获取一个文件句柄,从文件中读取数据,然后关闭文件句柄。
如果不用with语句,代码如下:
file = open("/tmp/foo.txt")
data = file.read()
file.close()
这里有两个问题。一是可能忘记关闭文件句柄;二是文件读取数据发生异常,没有进行任何处理。下面是处理异常的加强版本:
file = open("/tmp/foo.txt")
try:
    data = file.read()
finally:
    file.close()
虽然这段代码运行良好,但是太冗长了。这时候就是with一展身手的时候了。除了有更优雅的语法,with还可以很好的处理上下文环境产生的异常。下面是with版本的代码:
with open("/tmp/foo.txt") as file:
    data = file.read()


迭代器
迭代就是重复做一件事情。可迭代对象就是支持每次返回自己所包含的一个成员的对象。
对象实现了l1.__iter__()或者l1.__getitem__()方法,比如序列类型(list,str,tuple),非序列类型(dict,file),用户自定义的一些包含了.__iter__()或者.__getitem__()方法的类都是可迭代对象。
迭代器又称游标(cursor),是一种可在容器上实现的元素遍历的接口。迭代器本身不可逆,遍历后再想回头遍历,需重新创建迭代器。


列表解析:
根据已有列表快速高效的生成新列表的方式,就是列表解析。
[expression for iter_var in iterable]
[expression for iter_var in iterable if cond_expr]

从此旧列表Iterable中取出iter_var元素,进行expression的计算,然后存入新列表中。
cond_expr:可选,只有符合条件的,才放入新的列表中


import ospath = "D://PycharmProjects//SecondProject";filelist1 = os.listdir(path);filelist2 = [i for i in filelist1 if i.endswith(".txt")]print(filelist2)

生成器表达式及生成器yield
生成器表达式跟列表解析的关系,类似于xrange和range的关系,形式上就是列表解析的中括号变成小括号,作用是更加的节省内存。
生成器并不真正创建数字列表,而是返回一个生成器对象,此对象每次只计算出来一个条目,使用.next来获取下一个条目。函数中使用yield会返回一个生成器。
1. 通常的for...in...循环中,in后面是一个数组,这个数组就是一个可迭代对象,类似的还有链表,字符串,文件。它可以是mylist = [1, 2, 3],也可以是mylist = [x*x for x in range(3)]。它的缺陷是所有数据都在内存中,如果有海量数据的话将会非常耗内存。
生成器是可以迭代的,但只可以读取它一次。因为用的时候才生成。比如 mygenerator = (x*x for x in range(3)),注意这里用到了(),它就不是数组,而上面的例子是[]。
我理解的生成器(generator)能够迭代的关键是它有一个next()方法,工作原理就是通过重复调用next()方法,直到捕获一个异常。可以用上面的mygenerator测试。

带有 yield 的函数不再是一个普通函数,而是一个生成器generator,可用于迭代,工作原理同上。
yield 是一个类似 return 的关键字,迭代一次遇到yield时就返回yield后面(右边)的值。重点是:下一次迭代时,从上一次迭代遇到的yield后面的代码(下一行)开始执行。yield就是 return 返回一个值,并且记住这个返回的位置,下次迭代就从这个位置后(下一行)开始。

具体可参考网址:http://blog.csdn.net/guogaoan/article/details/37725411


enumerate
range可在非完备遍历中用于生成索引偏移,而非偏移处的元素,但是如果想同时获取索引和索引处的元素的话,则需要使用enumerate,此内置函数返回一个生成器对象。


for index,text in enumerate("abc"):   print (index ,text)for i1 in enumerate('def'):    print(i1)#0 a#1 b#2 c#(0, 'd')#(1, 'e')#(2, 'f')
原创粉丝点击