Python快速入门篇(三)

1.Python流程控制

1.1Python流程控制之if测试

条件测试
 if条件测试表达式,条件为真则执行,否则则执行另一个分支

1.Python的比较操作

所有的Python对象都支持比较操作
 -->可用于测试相当性、相对大小等
 -->如果是复合对象,Python会检查其所有部分,包括自动遍历各级嵌套对象,直到可以得出结果
测试操作符、
 -->"=="操作符测试值得相等性
 -->"is"表达式测试对象的一致性
Python中不同类型的比较方法
 -->数字:通过相对大小进行比较
 -->字符串:按照字典次序逐字符进行比较
 -->列表和元组:自左至右比较各部分内容
 -->字典:对排序之后的(键、值)列表进行比较
Python中真和假的含义
 -->非零数字为真,否则为假
 -->非空对象为真,否则为假
 -->None则始终为假

2.if测试的语法结构

if boolean_expression1: ##每一个冒号表示启用了一个子代码块
    suite1
elif boolean_expression2:
    suite2
....
else
    else_suite
elif语句是可选的
仅用于占位,而后再填充相关语句时,可以使用pass

三元组表达式:
通常在为某变量设定默认值时通常用到的如下格式
A = X if Y else Z
if Y:
    A = X
else
    A = Z
expression1 if boolean_expression else expression2
案例如下:
In [1]: A = 7
In [2]: B = 9
In [4]: max = A if A > B else B
In [5]: print max
9
In [18]: A if A > B else B
Out[18]: 10

1.2.Python流程控制之while和for循环

循环机制及应用场景

while循环
 -->用于编写通用迭代结构
 -->顶端测试为真即会执行循环体,并会重复多次测试直到为假后执行循环后的其它语句
for循环
 -->一个通用的序列迭代器,用于遍历任何有序的序列对象内的元素
 -->用于字符串、元组、列表和其它的内置可迭代对象,以及通过类所创建的新对象
Python也提供了一些能够进行隐形迭代的工具
 -->in成员关系测试
 -->列表解析
 -->map、reduce和filter函数

1.while循环语法格式

while boolean_expression:
    while_suite
else:
    else_suite
else分支为可选部分
只要boolean_expression的结果为True,循环就会执行;
boolean_expression的结果为False时终止循环,此时如果有else分支,则会执行

In [3]: url = "www.xionghaizi.com";x = 0
In [4]: while url: 
            print url
            url = url[:-1]
            x += 1
            if x > 7:
                break
        else:
            print "game over"
 ...: 
www.xionghaizi.com
www.xionghaizi.co
www.xionghaizi.c
www.xionghaizi.
www.xionghaizi
www.xionghaiz
www.xionghai
www.xiongha

 break:跳出最内层的循环
 continue:跳到所处的最近层循环的开始处
 pass:点位语句
 else代码库:循环正常终止才会执行,如果循环终止是由break跳出导致的,则else不会执行

2.练习题案例

1.逐一显示指定列表中的所有元素
In [10]: count = 0
In [9]: l1 = [1,2,3,4,5]
In [12]: while count < len(l1):
   ....:     print l1[count]
   ....:     count += 1

In [16]: while l1:
   ....:     print l1[0]
   ....:     l1 = l1[1:]

In [16]: while l1:
 ....: print l1.pop(0)
------------------------------------------------------------------------------------------
2.求100以内所有偶数之和
In [75]: x = 0; sum = 0;y = 100
In [76]: while x <= y:
   ....:     sum += x
   ....:     x += 2
         else:
In [77]:     print sum
2550

#创建一个变量x初始化为2
x = 2
#创建一个变量sum初始化为0
sum = 0
#使用while循环求出0-100所有偶数的和
while x <= 100 :
    sum += x 
    x += 2
#打印输出求和结果
else:
    print(sum)
------------------------------------------------------------------------------------------
3.逐一显示指定字典的所有键;并于显示结果后说明总键数
d1 = {'x':1,'y':23,'z':78}
keylist = d1.keys()
while keylist:
    print keylist[0]
    keylist.pop(0)
else:
    print len(d1)
------------------------------------------------------------------------------------------
4.创建一个包含了100以内所有奇数的列表
l1 = []
x = 1
while x < 100:
    l1.append(x)
    x += 2
else:
    print l1
------------------------------------------------------------------------------------------
5.逆序逐一显示一个列表的所有元素
l1 = [1,2,3,4,5]
while l1:
    print l1[-1]
    l1.pop()
------------------------------------------------------------------------------------------
6.列表l1=[0,1,2,3,4,5,6],列表l2=["Sum","Mon","Tue","Wed","Thu","Fri","Sat"],以第一个列表中的元素为键,以第二个列表中
的元素为值生成字典d1;
d1 = {}
count = 0
l1=[0,1,2,3,4,5,6]
l2=["Sum","Mon","Tue","Wed","Thu","Fri","Sat"]
if len(l1) == len(l2):
    while count < len(l1):
    d1[l1[count]] = l2[count]
    count += 1
else:
    print d1

1.3for循环语法格式

for expression1 in iterable:
    for_suite
else:
    else_suite
通常,expression或是一个单独的变量,或是一个变量序列,一般以元组的形式给出
如果元组或列表用于expression,则其中的每个数据都会拆分到表达式项,例如
T=[(1,2),(3,4),(5,6),(7,8)]
for (a,b) in T:
    print a,b
------------------------------------------------------------------------------------------
使用for循环计算100内的正整数和
sum = 0
for i in range(1,101):
    sum += i
else:
    print sum
 ....: 
5050
编写循环的技巧
for循环比while循环执行速度快
Python提供了两个内置函数,用于在for循环中定制特殊的循环
 -->range或xrange
   >>range:一次性地返回连续的整数列表
   >>xrange:一次产生一个数据元素,相较于range更节约空间
zip
   >>返回并行的元素元组的列表,常用于在for循环中遍历数个序列
------------------------------------------------------------------------------------------
案例练习
用于每隔一定的个数元素挑选一个元素
S = "How are you there days?"

range(0,len(S),2)
[0, 2, 4, 6, 8, 10, 12, 14, 16, 18, 20, 22]

for i in range(0,len(S),2):
    print S[i],
 ....: 
H w a e y u t e e d y ?
------------------------------------------------------------------------------------------
修改列表
L = [1,2,3,4,5]
for i in range(len(L)):
    L[i] += 1
else:
    print L
------------------------------------------------------------------------------------------
zip
  >>取得一个或多个序列为参数,将给定序列中的并排的元素配成元组,返回这些元组的列表
    >>当参数长度不同时,zip会以最短序列的长度为准
  可在for循环中用于实现并行迭代
L1 = [1,2,3,4,5,6,7]
L2 = ['a','b','c','d','e','f','g']
zip(L1,L2)
[(1, 'a'), (2, 'b'), (3, 'c'), (4, 'd'), (5, 'e'), (6, 'f'), (7, 'g')]
------------------------------------------------------------------------------------------
zip也常用于动态构造字典
In [83]: keys = [1,2,3,4,5,6,7]

In [84]: values = ["Sun","Mon","Tue","Wed","Thu","Fri","Sat"]

In [85]: D = {}

In [86]: for (k,v) in zip(keys,values):
 ....:       D[k] = v
 ....:   else:
 ....:      print D
 ....: 
{1: 'Sum', 2: 'Mon', 3: 'Tue', 4: 'Wed', 5: 'Thu', 6: 'Fri', 7: 'Sat'}
------------------------------------------------------------------------------------------
In [102]: test = []
In [103]: while True:
 .....:       x = raw_input('Enter an entry: ')
 .....:       if x == 'q' or x == 'quit':
 .....:           break
 .....:       else:
 .....:           test.append(x)
 .....: 
Enter an entry: a
Enter an entry: b
Enter an entry: c
Enter an entry: d
Enter an entry: e
Enter an entry: q

In [104]: print test
['a', 'b', 'c', 'd', 'e']
------------------------------------------------------------------------------------------
for循环练习案例:
练习1.逐一分开显示指定字典d1中的所有元素,类似如下
k1 v1
k2 v2
---------------------------------------------------------------------------------------
d1 = {'x':1,'y':2,'z':3}
d1.items()
[('y', 2), ('x', 1), ('z', 3)]
for (k,v) in d1.items():
    print k,v
y 2
x 1
z 3
---------------------------------------------------------------------------------------
练习2:逐一显示列表中l1=["Sun","Mon","Tue","Wed","Thu","Fri","Sat"]中的索引为奇数的元素
l1=["Sun","Mon","Tue","Wed","Thu","Fri","Sat"]
l1[1:len(l1):2]
['Mon', 'Wed', 'Fri']

for i in range(1,len(l1),2):
    print l1[i],
Mon Wed Fri
------------------------------------------------------------------------------------------
练习3:将属于列表l1=["Sun","Mon","Tue","Wed","Thu","Fri","Sat"],但不属于列表l2=["Sun","Mon","Tue","Thu","Sat"]的所
有元素定义为一个新列表l3;
l1=["Sun","Mon","Tue","Wed","Thu","Fri","Sat"]
l2=["Sun","Mon","Tue","Thu","Sat"]
l3 = []
for i in range(len(l1)):
    if l1[i] not in l2:
        l3.append(l1[i])
print l3
['Wed', 'Fri']

for i in l1:
    if i not in l2:
        l3.append(i)
------------------------------------------------------------------------------------------
练习4.已知列表namelist=['stu1','stu2','stu3','stu4','stu5','stu6','stu7'],删除列表removelist=['stu3','stu7','stu9']
请将属于removelist列表中的每个元素从namelist中移除(属于removelist,但不属于namelist的忽略即可)
namelist=['stu1','stu2','stu3','stu4','stu5','stu6','stu7']
removelist=['stu3','stu7','stu9']
for i in removelist:
    if i in namelist:
        namelist.remove(i)
    else:
        print namelist
['stu1', 'stu2', 'stu4', 'stu5', 'stu6']

2.Python迭代器、列表解析及生成器

2.1Python迭代

Python迭代:
  >>迭代:重复做一件事
  >>iterable(可迭代)对象
    -->支持每次返回自己所包含的一个成员的对象
    -->对象实现了__iter__方法
       >>序列类型,如list,str,tuple
       >>非序列类型,如:dict,file
       >>用户自定义的一些包含了__iter__()或__getitem__()方法的类

2.2迭代器

>>迭代器(iterator)又称游标(cursor),它是程序设计的软件设计模式,是一种可在容器物件(container,如列表等)上实现元素遍历的接口
>>迭代器是一种特殊的数据结构,当然在Python中,它也是以对象的形式存在的
  -->简单理解方式:对于一个集体中的每一个元素,想要执行遍历,那么针对这个集体的迭代器定义了遍历集体中每一个元素的顺序或者方法
>>在Python中,迭代器是遵循迭代协议的对象
>>使用iter()可从任何序列对象中得到迭代器
>>若要实现迭代器,需要在类中定义next()方法(Python3中是__next__())
>>要使得迭代器指向下一个元素,则使用成员函数next()
  -->在Python中,是函数next(),而非成员函数
>>当没有元素时,则引发StopIteration异常

>>for循环可用于任何可迭代对象
  -->for循环开始时,会通过迭代协议传递给iter()内置函数,从而能够从迭代对象中获得一个迭代器,返回的对象含有需要的next方法

2.3Python列表解析

>>列表解析是Python迭代机制的一种应用,它常用于实现创建新的列表,因此要放置于[]中
>>语法:
[expression for iter_var in iterable]
[expression for iter_var in iterable if cond_expr]
-------------------------------------------------------------------------------
In [140]: L = [x**2 for x in range(9)]
In [141]: L
Out[141]: [0, 1, 4, 9, 16, 25, 36, 49, 64]

In [144]: L1 = [i**2 for i in L if i <16]
In [145]: print L1
[0, 1, 16, 81]

In [156]: for i in [i**2 for i in range(1,11) if i % 2 == 0]: print i/2,
2 8 18 32 50
-------------------------------------------------------------------------------
##Python标准库模块os
In [157]: import os
In [158]: os.listdir('/var/log')
Out[158]: 
['tallylog',
 'lastlog',
 'wtmp',
 'btmp',
 'ppp',
 'tuned',
 'audit',
 'anaconda',
 'wpa_supplicant.log',
 'dmesg.old',
 'yum.log',
 'cron-20190616',
 'cron',
 'maillog-20190616',
 'maillog',
 'messages-20190616',
 'messages',
 'secure-20190616',
 'secure',
 'spooler-20190616',
 'spooler',
 'boot.log',
 'dmesg']

In [161]: filelist2 = [ i for i in os.listdir('/var/log') if i.endswith('.log') ]
In [162]: print filelist2
['wpa_supplicant.log', 'yum.log', 'boot.log']

l1 = ['x','y','z']
l2 = [1,2,3]
l3 = [(i,j) for i in l1 for j in l2]
print l3
[('x', 1), ('x', 2), ('x', 3), ('y', 1), ('y', 2), ('y', 3), ('z', 1), ('z', 2), ('z', 3)]

l1 = ['x','y','z']
l2 = [1,2,3]
l3 = [(i,j) for i in l1 for j in l2 if j !=1 ]
print l3

2.4生成器表达式

>>生成器表达式并不真正创建数字列表,而是返回一个生成器对象,次对象在每次计算出一个条目后,把这个条目"产生"(yield)出来
  -->生成器表达式使用了"惰性计算"或称作"延迟求值"的机制
>>序列过长,并且每次只需要获取一个元素时,应当考虑使用生成器表达式而不是列表解析
  -->生成器表达式于Python2.4引入
>>语法:
(expr for iter_var in iterable)
(expr for iter_var in iterable if cond_expr)

1.产生偏移和元素

>>enumerate
 -->range可在非完备遍历中用于生成索引偏移,而非偏移处的元素
 -->如果同时需要偏移索引和偏移元素,则可以使用enumerate()函数
 -->次内置函数返回一个生成器对象
S = 'hello world'
E = enumerate(S)
E.next()
(0,'h')
E.next()
(1,'e')

3.Python文件对象及os、os.path和pickle模块

3.1Python文件对象

1.文件系统和文件

>>文件系统是os用于明确磁盘或分区上的文件的方法和数据结构--即在磁盘上组织文件的方法
>>计算机文件(或称文件、电脑档案、档案),是存储在某种长期存储设备或临时存储设备中的一段数据流,并且归属于计算机文件系统管理之下
>>概括来讲:
 -->文件就是计算机中由OS管理的具有名字的存储区域
 -->在linux系统上,文件被看做是自己序列

2.Python打开文件

>>Python内置函数open()用于打开文件和创建文件对象
 -->open(name[,mode[,bufsize]])
>>open方法可以接收三个参数:文件名、模式和缓冲区参数
 -->open函数返回的是一个文件对象
 -->mode:指定文件的打开模式
 -->bufsize:定义输出缓存
    @.0表示无输出缓存
    @.1表示使用缓冲
    @.负数表示使用系统默认设置
    @.正数表示使用近似指定大小的缓冲

3.文件的打开模式

简单模式:
>>r:只读
  -->open('/var/log/message.log','r')
>>w:写入
>>a:附加 (打开后从文件尾部输入内容)
>>在模式后使用"+"表示同时支持输入、输出操作
  -->如r+、w+和a+
>>在模式后附加"b"表示以二进制方式打开
  -->如rb、wb+

 file.seek(offset[whence])
 whence:起点
 0:从文件头
 1:从当前位置
 2:从文件尾
 offset:偏移量

4.文件方法

f.read([n])              ##最多读取n个字节
f.readline([n])          ##读取单行输入的最多n个字符,如果省略了n,该方法将读取整行
f.readlines([size])      ##读取所有行并返回一个列表,size是可选的,用于指定在读取操作停止前在文件上读取的近似字符数
f.write(s)               ##写入字符串s
f.writelines(lines)      ##希尔序列lines中的所有字符串
f.close()                ##关闭文件
f.tell()                 ##返回当前文件指针
f.seek(offser[,whence])  ##查找新文件位置
f.isatty()               ##如果f是一个交互式终端,则返回1
f.flush()                ##清除输出缓冲区
f.truncate([size])       ##将文件截断为最多size字节
f.fileno()               ##返回一个整数文件描述符
f.next()                 ##返回下一行或引发stopiteration,在Python3中,对应的方法称为f.__next__()

5. 文件系统模块:os

 文件系统模块:os
 目录:
 chdir():切换工作目录
 chroot():设定当前进程的根目录
 listdir():列出指定目录下的所有文件名
 mkdir():创建指定目录
 makedirs():创建多级目录
 getcwd():获取工作目录
 rmdir():删除目录
 removedirs():删除多级目录

 文件:
 mkfifo():创建管道
 mknod():创建设备文件
 remove():删除文件
 unlink():删除链接文件
 rename():重命名
 stat():放回文件的状态信息
 symlink():创建链接文件
 utime():更新时间戳
 tmpfile():创建并打开(w+b)一个新的临时文件
 walk():创建目录树

 访问权限相关的
 access():检验某个用户或用户组的权限模式
 chmod():修改权限
 chown():修改属主和属组
 umask():设置默认权限模式

 文件描述符:
 open():底层操作系统的open()
 read():
 write():

 设备文件:
 makedev():
 major():获取主设备号
 minor():获取次设备号

 路径管理:
 import os.path
 basename():文件基名
 dirname():路径目录名
 join():整合文件名
 split():返回dirname(),basename()元组
 splitext():返回(filename,extension)元组


 信息:
 getatime()
 getctime()
 getmtime()
 getsize():返回文件的大小

 查询
 exists():判断指定文件是否存在
 isabs():判断指定的路径是否为绝对路径
 isdir():是否为目录
 isfile():是否为文件
 islink():是否为符号链接
 ismount():是否为挂载点
 samefile():两个路径是否指向了同一个文件

练习:判断文件是否存在,存在则打开 让用户通过键盘反复输入多行数据追加保存至此文件中
 
#!/usr/bin/python
import os
import os.path
filename=raw_input('plz a file name:')
if os.path.isfile(filename):
    openname= open(filename,'a+')
while True:
    newline=raw_input('plz a line:')
    if newline == 'q' or newline =='quit':
        break
    else:
        openname.write(newline+'\n')
openname.close()

对象持久存储:pickle;marshal
DBM接口
shaelve模块

 

0
如无特殊说明,文章均为本站原创,转载请注明出处

该文章由 发布

这货来去如风,什么鬼都没留下!!!
发表我的评论

Hi,请填写昵称和邮箱!

取消评论
代码 贴图 加粗 链接 删除线 签到