条件、循环和其他语句

赋值语句

1.序列解包

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

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

交换变量试试

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

了解一下 序列解包递归解包 --将多个值的序列解开,然后放到变量的序列中。

>>> values=1,2,3
>>> values
(1, 2, 3)
>>> x,y,z=values
>>> x
1

当函数或者方法返回元组时,这个特性就很有用。假设需要获取(和删除)字典中任意的键-值对,可以使用popitem方法,这个方法将键-值作为元组返回

>>> person={'name':'Joe','age':11}
>>> key,value=person.popitem()
>>> key
'age'
>>> value
11
>>> person
{'name': 'Joe'}

2.链式赋值

将同一个值赋值给多个变量的捷径叫链式赋值,有点像并行赋值

x=y=somefunction

>>> x=y=1
>>> x,y
(1, 1)

与下面语句实现的一样

y=somefunctin

x=y

>>> y=1
>>> x=y
>>> x,y
(1, 1)

但上面的语句和下面不一定等价

x=somefunction

y=somefunction

3.增量赋值

将表达式运算符(+ - * / %)放置在赋值运算符(=)的左边,叫增量赋值

>>> x=1
>>> x+=1
>>> x
2
>>> fruit='apple'
>>> fruit+=' banana'
>>> fruit*=2
>>> fruit
'apple bananaapple banana'

语句块:缩排的乐趣

语句块在条件为真时执行的一组语句,在代码前放置空格来缩进语句可创建语句块。在Python中,冒号(:)用来标识语句块的开始,块中每个语句都是缩进的(缩进量相同)。当回到已经闭合的块一样的缩进量时,就表示当前块已经结束。

条件和条件语句

1.布尔变量

真值(也叫布尔值)

作为布尔表达式时,标准值False 和None 、所有类型的数字0(包括浮点型、长整型和其他类型)、空序列(比如空字符串、元组和列表)以及空的字典都为假(false),即False   None  0   '' ''   ()   [ ]  { }

虽然() [ ] { }都是假值,但并不意味着相等False!=()、[ ]!='' "

其他的都被解释为真,包括特殊值True

标准的布尔值是True(1)和False(0)

布尔值True和False 属于布尔类型,bool函数可以用来准换其他值

>>> True == 0
False
>>> True==1
True
>>> True+False+1
2
>>> bool('I like bananas')
True
>>> bool()
False
>>> bool({})
False
>>> bool({}=='')
False
>>> bool(''!=False)
True

2.条件执行和if语句

if 和冒号之间的表达式为条件。条件为真,就执行语句块

x=1
if x==1:
    print ('Right')

3.else子句

4.elif 子句

elif是else if 缩写

5.嵌套代码块

if 语句里面可以嵌套使用if语句

6.更复杂的条件

(1)比较运算符,Python中比较运算符和赋值运算符一样是可以连接的,几个运算符可以一起使用如0<x<10

 
表达式描述
x==yx等于y
x<yx小于y
x>yx大于y
x>=yx大于等于y
x<=yx小于等于y
x!=yx不等于y
x is yx和y是同一对象
x is not yx和y不是同一对象
x in yx是y容器的成员
x not in yx不是y容器的成员

(2)相等运算符

两个等号x==y判断x和y是否相等

(3) is : 同一性运算符

>>> x=y=[1,2,3]
>>> z=[1,2,3]
>>> x is y
True
>>> x is z
False

x和z相等却不等同,因为is 是判断同一性而不是判断相等性,它们值相等,但是不是同一对象

>>> x=[1,2,3]
>>> y=[0,2]
>>> x is not y
True
>>> y.append(3)
>>> y[0]=1
>>> y
[1, 2, 3]
>>> x is y
False

显然,两个列表值相等但不等同

总结,使用==运算符来判断两个对象是否相等1,使用is 判定两者是否等同(同一对象)

(4)in:成员资格运算符

它可以向比较运算符一样在条件语句中使用

name = raw_input('What is your name?')
if 's' in name:
    print ('Your name contains the letter "s".')
else:
    print ('Your name does not contain the letter "s".')
           

(5)字符串和序列比较

字符串可以按照字母顺序排列进行比较

>>> 'apple'>'banana'
False
>>> "Apple".upper()=="apple".upper()
True
>>> [1,[2,5]]<[1,[4,3]]
True

(6)布尔运算符:and 、not 、 or

它们连接两个布尔值

number=input('Enter a number between 1 and 10: ')
if number <= '10' and number >= '1':
    print ("Right")
else:
    print ("Wrong")

内置表达式 a if b else c

这个语句表示如果,b为真返回a,否则返回c

>>> 'T' if 1==1 else 'F'
'T'

7.断言

如果需要确保程序中的某个条件一定为真才能让程序正常工作的话,assert语句就有用了,它可以在程序中置入检查点,条件后可以添加字符串,用来解释断言

>>> youth_teenager=19
>>> assert 12<=youth_teenager<=18,'The age must be right'
Traceback (most recent call last):
  File "<pyshell#19>", line 1, in <module>
    assert 12<=youth_teenager<=18,'The age must be right'
AssertionError: The age must be right

循环

1.while 循环

name=''
while not name:
    name=input('Please enter your name: ')
print ('Hello,%s!'%name)

结果呢

Please enter your name:  
Hello, !

输入一个空格,接受了,出现了小bug,将while not name改成while not name or name.isspace(),或者使用while not name.strip()

再输入空格就不会接受了

Please enter your name:  
Please enter your name: Joe
Hello,Joe!

2.for循环

words={'this','is','a', 'lovely','dog'}
for word in words:
    print (word)
lovely
this
dog
a
is
numbers=[0,1,2,3,4,5,6,7,8,9]
for number in numbers:
    print(number)
0
1
2
3
4
5
6
7
8
9

for循环比while循环更简洁,如果能用for ,就尽量不用whlie循环

先介绍range函数,再看个实例,迭代(循环另一种说法)某范围的数字很常见,有个内建的范围函数就很方便,如range()函数,range函数包含下限,不包含上限,range(10)相当于range(0,10),会默认下线为0

for number in range(10):
	print (number)

3.循环遍历字典元素

一个简单for语句就能循环遍历字典所有键

d={'x':1,'y':2,'z':3}
for key in d:
    print (key,'correspond to',d[key])
#或者
#for key,value in d.items():
#    print (key,'correspond to',value)
x correspond to 1
y correspond to 2
z correspond to 3

如果只需要值,可以使用d.values();只需要键,可以使用d.keys().d.items()方法会将键—值对作为元组返回。for 循环一大好处就是可以在循环使用中使用序列解包

d={'x':1,'y':2,'z':3}
for value in d.items():
    print (d.values())
    
dict_values([1, 2, 3])
dict_values([1, 2, 3])
dict_values([1, 2, 3])

4.一些迭代工具

(1)并行迭代

程序可以同时迭代两个序列,如下

names = ['Joe','Amy','Kitty']
ages=[10,11,12]
for i in range(len(names)):
    print (names,'is',ages[i],'years old')

i是循环变量标准变量名

['Joe', 'Amy', 'Kitty'] is 10 years old
['Joe', 'Amy', 'Kitty'] is 11 years old
['Joe', 'Amy', 'Kitty'] is 12 years old

内建zip函数可以用来进行并行迭代,把两个序列“压缩”在一起,然后返回一个元组的列表,需要注意的是,zip方法在Python2和Python3中的不同,在Python3中为了减少内存,返回一个对象,zip()返回的是一个对象。如需展示列表,需手动list()转换

>>> list(zip(names,ages))
[('Joe', 10), ('Amy', 11), ('Kitty', 12)]

试试在循环中解包元组:

for  name,age in list(zip(names,ages)):
    print (name,'is',age,'years old')
Joe is 10 years old
Amy is 11 years old
Kitty is 12 years old

zip函数可以用于任意多的序列。关于它重要的一点可以处理不等长的序列,当最短的序列“用完”的时候就会停止

(2)按索引迭代

有时想要迭代访问序列中的对象,同时还要获取当前对象的索引。例如在一个字符串列表中替换所有包含‘xxx'的子字符串。使用内建enumerate函数,这个函数在提供索引的地方迭代索引-值对。

(3)翻转和排序迭代

reversed 和sorted函数(sorted和sort使用同样的参数),作用于任何一个更加不可思议的可迭代对象上,不是原地修改对象,而是返回翻转或排序后的版本,具体用法看下面:

>>> sorted([5,2,4,1,3])
[1, 2, 3, 4, 5]
>>> list(reversed('a lovely dog!'))
['!', 'g', 'o', 'd', ' ', 'y', 'l', 'e', 'v', 'o', 'l', ' ', 'a']
>>> list(reversed([1,2,3,4,5]))
[5, 4, 3, 2, 1]
>>> ''.join(reversed('a lovely dog'))
'god ylevol a'

(5)跳出循环

1.break

跳出循环可以使用break语句。假设找100以内的最大平方数,从100往下迭代到0,找到平方数81就不用继续循环了,此时跳出循环

from math import sqrt
for n in range(99,0,-1):#第三个参数表示步长
    root =sqrt(n)
    if(root==int(root)):
        print (n)
        break

2.continue

continue语句只是让当前的循环结束,跳到下一轮循环的开始

3.while True/break习语

word='dummy '
while word :
    word = input("Please enter a word: ")
    print ("The word was "+word)

在进入循环之前需要给word赋一个哑值。使用哑值(dummy value)就是工作没有尽善尽美的标志,尽量避免它:

word=input("Please enter a word: ")
while word :
    print ("The word was "+word)
    word = input("Please enter a word: ")

这样呢,虽没有哑值,但调用两次input.不想这么做,试试 while True/break语句:

while True:
    word = input("Please enter a word: ")
    if not word:break
    print ("The word was "+word)
    

6.循环中的else 子句

当循环内使用break语句时,通常因为“找到”了某物或者因为“某事”发生了。在跳出时做一些事情很简单,比如print (n).但是有时候想要在没有跳出之前做一些事情,怎么判断呢?可以使用布尔变量,在循环前将其设定为Flase,跳出后设定为True,然后使用if语句查看循环是否跳出了:

broke_out=False
for x in seq:
    do_something(x)
    if condition(x):
        broke_out=True
        break
    do_something_else(x)
if not broke_out:
    print "I didn't broke out"

更简单的方式是在循环中加一个else 子句,仅在没有调用break 时执行

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

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

列表推导式是利用其他列表创建新列表(类似数学术语集合等式)的一种方法,它的工作类似于for循环

>>> [x*x for x in range(10)]
[0, 1, 4, 9, 16, 25, 36, 49, 64, 81]

列表由range(10)中每个x的平方组成,如果只想打印被3整除数,可以使用if

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

可以增加更多for语句部分

>>> [(x,y)for x in range(3) for y in range(3)]
[(0, 0), (0, 1), (0, 2), (1, 0), (1, 1), (1, 2), (2, 0), (2, 1), (2, 2)]

作为对比下面代码使用两个for语句相同的列表

result=[]
for x in range(3):
    for y in range(3):
        result.append((x,y))
        print ((x,y))

更多的for语句也可以与if 联合使用

>>> girls=['alice','berry','clarice']
>>> boys=['chris','arnold','bob']
>>> [b+'+'+g for b in boys for g in girls if b[0]==g[0]]
['chris+clarice', 'arnold+alice', 'bob+berry']

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值