Python基础教程(第2版)第五章 条件、循环和其他语句

  • Post author:
  • Post category:python


1.print和import

在Python 3.0中,print不再是语句而是函数(功能基本不变)

可以使用print打印多个表达式,用逗号分隔就行

print('Age'+':',42)	#Age: 42

print的参数并不能像我们预期的那样构成一个元组

对于很多应用程序来说,使用logging模块记日志比print语句更合适

import:导入功能

from math import *	#从给定模块导入所有功能
print(sqrt(4))  #2.0

可以在语句末尾增加一个as子句,在该子句后给出名字,为整个模块提供别名

import math as foobar1
print(foobar1.sqrt(9))  #3.0

还可以给函数取别名

from math import sqrt as foobar2
print(foobar2(169)) #13.0

2.赋值

2.1 序列解包

允许函数返回一个以上的值并打包成元组,然后通过一个赋值语句很容易进行访问

包序列中的元素数量必须和放置在赋值符号=左边的变量数量完全一致

让多个赋值操作可以同时进行

x,y,z=1,2,3
print(x,y,z)    #1 2 3

还可以用它交换两个 (或更多个)变量

x,y,z=y,x,z
print(x,y,z)    #2 1 3

假设需要获取 (和删除)字典中任意的键值对,可以使用popitem方法,这个方法将键值对作为元组返回,然后这个元组就可以直接赋值到两个变量中

scoundrel={'name':'Robin','girlfriend':'Marion'}
key,value=scoundrel.popitem()
print(key+':',value)	#girlfriend: Marion

Python 3.0中有另外一个解包的特性:可以像在函数的参数列表中一样使用星号运算符(将所有其他参数放在一个变量中)

使用星号的变量可以放在第一个,此时它会包含一个列表

a,b,*rest=[1,2,3,4]
print(a,b,rest)  #1 2 [3, 4]

2.2 链式赋值

是将同一个值赋给多个变量的捷径

x=y=somefunction()
#等价于
y=somefunction()
x=y

2.3 增量赋值

增量赋值对其他数据类型也适用

value*=2
print(value)    #MarionMarion

3.语句块:缩排的乐趣

语句块是在条件为真时执行或执行多次的一组语句

冒号用来标识语句块的开始,块中的每一个语句都是缩进的(缩进量相同)

当回退到和己经闭合的块一样的缩进量时,就表示当前块已经结束了

4.条件和条件语句

Python中所有值都能被解释为真值

false、None、0、””、[]、{}会被解释器看作假,其它的一切会被解释为真

print(bool([])) #False

if、else和elif

# name=input("What is your name?")
name="Gumby"
if name.endswith('Gumby'):	#if语句
    if name.startswith('Mr.'):  #if语句中嵌套if语句
        print('Hello,Mr.Gumby')
    elif name.startswith('Mrs.'):	#elif语句:else if的简写,是有条件的else语句
        print('Hello,Mrs.Gumby')
    else:
        print('Hello,Gumby')    #Hello,Gumby
else:	#else语句
    print('hello, stranger')

用在条件中最基本的运算符就是比较运算符

#比较运算符
x=y=[1,2,3]
z=[1,2,3]
print("x==y:",x==y) #x==y: True
print("x==z:",x==z) #x==z: True
#同一性运算符(x和y是同一个对象)
print("x is y:",x is y) #x is y: True#
print("x is z:",x is z) #x is z: False
#成员资格运算符
# name=input('What is your name?')
name="Gumby"
if 's' in name:     
    print('You name contains the letter "s".')
else:
    print('Your name does not contains the letter "s".')    #Your name does not contains the letter "s".
#布尔运算符:使用and、or和not这三个运算符可以随意结合真值
# number=int(input('Enter a number between 1 and 10:') or 9)    #短路逻辑
number=9
if number <=10 and number >=1:
    print('Great!') #Great!
else:
    print('Wrong!')

断言assert:用于在程序中置入检查点,确保程序中的某个条件一定为真才能让程序正常工作

在检查函数参数的属性时使用,或者作为初期测试和调试过程中的辅助条件

age=10
assert 0<age<100
age=-1  #报错
assert 0<age<100,"The age must be realistic"    #条件后可以添加字符串用来解释断言

5.循环

5.1 while循环

while语句非常灵活,它可以用来在任何条件为真的情况下重复执行一个代码块

x=1
while x<=5:
    print(x)
    x+=1

5.2 for循环

如果能使用for循环就尽量不使用while循环

for循环可以在循环中使用序列解包

d={'x':1,'y':2,'z':3}
for key,value in d.items(): # d.items:将键-值对作为元组返回
    print(key,'corresponds to',value)   #x corresponds to 1
#                                       y corresponds to 2
#                                       z corresponds to 3

5.3 一些迭代工具

并行迭代:程序可以同时迭代两个序列

names=['anne','beth','george','damon']
ages=[12,45,32,102]
for i in range(len(names)):
    print(names[i],'is',ages[i],'years old.')
# anne is 12 years old.
# beth is 45 years old.
# george is 32 years old.
# damon is 102 years old.

内建的zip函数可以把多个序列压缩在一起,用来实现并行迭代

print(zip(names,ages)) #<zip object at 0x10f955048>
for i in zip(names,ages):
    print(names,'is',ages,'years old.')   #
# ['anne', 'beth', 'george', 'damon'] is [12, 45, 32, 102] years old.
# ['anne', 'beth', 'george', 'damon'] is [12, 45, 32, 102] years old.
# ['anne', 'beth', 'george', 'damon'] is [12, 45, 32, 102] years old.
# ['anne', 'beth', 'george', 'damon'] is [12, 45, 32, 102] years old.

编号迭代:有些时候想要迭代序列中的对象,同时还要获取当前对象的索引

可以使用内建的enumerate函数:在提供索引的地方迭代索引值对

for index,name in enumerate(names): 
    if 'damon' in name:
        names[index]='[censored]'
for name,age in zip(names,ages):
    print(name,'is',age,'years old')
# anne is 12 years old
# beth is 45 years old
# george is 32 years old
# [censored] is 102 years old

排序迭代(返回的是列表):作用于任何序列或可迭代对象上,不是原地修改对象,而是返回排序后的版本

print(sorted('Hello,world!'))   #['!', ',', 'H', 'd', 'e', 'l', 'l', 'l', 'o', 'o', 'r', 'w']

翻转迭代(返回的是可迭代对象):作用于任何序列或可迭代对象上,不是原地修改对象,而是返回翻转后的版本

print(list(reversed('Hello,world!')))   #['!', 'd', 'l', 'r', 'o', 'w', ',', 'o', 'l', 'l', 'e', 'H']

5.4 跳出循环


break

:结束或跳出循环

from math import sqrt
for n in range(99,0,-1):  #range(上限,下限,步长)
    root=sqrt(n)
    if root==int(root):
        print(n)    #81
        break 


continue

:当前迭代结束,“跳”到下一轮循环的开始


while True/break

:第一部分负责初始化,第二部分在循环条件为真的情况下使用第一部分初始化好的数据

while True:
    x+=1    
    if(x>3):break   #条件满足时结束
    print(names[x])
# anne
# beth
# george
# [censored]

循环中的else语句:仅在没有调用循环内的break时执行

from math import sqrt
for n in range(99,81,-1):  
    root=sqrt(n)
    if root==int(root):
        print(n)
        break 
else:
    print("didn't find it!")    #didn't find it!

6.列表推导式——轻量级循环

列表推导式[]:利用其它列表创建新列表(类似于数学术语中的集合推导式)

print([x*x for x in range(10) if x%3==0])   #[0, 9, 36, 81]

7.pass、del和exec


pass

:可以在代码中做占位符使用

当程序需要一个if语句并进行测试,但是缺少其中一个语句块的代码时

name='Enid'
if name=='Ralph Auldus Melish':
    print('Welcome!')
elif name=='Enid':
    pass   #表示还没完,如果不写这个,会报错,空代码块是非法的。
elif name=='Bill Gates':
    print('Access Denied')


del

:不仅会移除一个对象的引用,也会移除那个名字本身,但不会删除值

x=['Hello','world']
y=x
y[1]='python'
del x
print(y)    #['Hello', 'python']


exec

:执行存储在字符串中的代码(会有严重的潜在安全漏洞)

最有用的地方在于可以动态地创建代码字符串

exec("print( 'Hello world!')")  #Hello world!


eval

:会计算以字符串形式书写的Python表达式,并且返回结果值

print("eval:",eval("6+18*2"))   #eval: 42



版权声明:本文为qq_41634454原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。