Python学习笔记八:控制语句

语句块并非是一种语句,语句块是一组满足一定条件时执行一次或多次的语句。语句块创建方式是在代码前放置空格缩进。

同一段语句块中每行语句都要保持同样的缩进,如果缩进不同,Python编译器就会认为不属于同一个语句块或认为是错误的。

在Python中,冒号( : )用来标识语句块的开始,语句块中每一个语句都需要缩进(缩进量相同)。当退回到和已经闭合的块一样的缩进量时,表示当前语句块已经结束了。

1、赋值语句

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

在Python中,交换所做的事情叫做序列解包或可选迭代解包,即将多个值的序列解开,然后放到变量序列中。

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

序列解包允许函数返回一个以上的值并打包成元组,然后通过一个赋值语句进行访问。这里需要一点,解包序列中的元素数量必须和防止在赋值符号 “ = ” 左边的数量完全一致,否则Python会在赋值时引发异常。

>>>x,y,z = 1,2,3
>>>x,y,z
(1,2,3)
>>>x,y,z = 1,2
Traceback (most recent call last):
  File "<pyshell#0>", line 1, in <module>
    x,y,z = 1,2
ValueError: not enough values to unpack (expected 3, got 2)
>>>x,y,z = 1,2,3,4,5
Traceback (most recent call last):
  File "<pyshell#1>", line 1, in <module>
    x,y,z = 1,2,3,4,5
ValueError: too many values to unpack (expected 3)

当右边的元素数量和左边的变量数量不一致时,执行结果就会报错,错误原因是没有足够的值解包或多个值未解包。

2)链式赋值

序列解包在对不同变量赋不同的值时非常有用,赋相同的值时用序列解包也可以实现。除此之外,链式赋值也可以实现:

>>>x=y=z=10
>>>x
10

由输出结果可知,可以通过多个等式为变量赋同一个值,这种方法叫做链式赋值。
链式赋值是将同一个值赋给多个变量。

>>>x=10
>>>y=x
>>>y
10

3)增量赋值

使用赋值运算符时没有将表达式写成类似x=x+1的形式,而是将表达式放置在赋值运算符(=)的左边(如将x = x + 1写成x += 1),这种写法在Python中叫做增量赋值。这种写法对乘除取模等标准运算符都适用。

>>>x=5
>>>x+=1
>>>x
6
>>>x-=2
>>>x
4
>>>x*=2
>>>x
8
>>>x/=4
>>>x
2.0

增量赋值除了适用于数值类型,还适用于二元运算符的数据类型。

>>>field = ‘Hello , ’
>>>field += ‘world’ 
>>>field
‘Hello ,world’
>>>field*=2
>>>field
‘Hello ,world Hello ,world’

增量赋值也可以用于字符串,增量赋值可以让代码在很多情况下更易读,也可以帮助我们写出更紧凑、简练的代码。

2、条件语句

运算符中提到的True、False就是布尔变量,布尔变量一般对应的是布尔值(也称为真值)标准值Flase和None、所有类型的数字0(包括浮点型、长整型和其他类型)、空序列(如空字符串、空元组和空列表)以及空字典都为假。其他值都为真,包括原生的布尔值True。
Python中,标准的真值只有True和Flase两个。在其他语言中,标准的真值为0和1,事实上,True和Flase只不过是1和0的另一种表现形式,作用相同。

使用bool()函数可以做boolean值转换。因为所有制都可以用作布尔值(真值),所以几乎不需要对它们进行显式转换,Python会自动转换这些值。

1) if语句

如果条件(if和冒号之间的表达式)判定为真,后面的语句块就会被执行;如果条件判定为假,语句块不会被执行。

greeting = ‘Hello’
if greeting ==‘Hello’ :
    print(‘hello’)

Hello

在if语句块中还可以执行一些复杂操作

greeting = ‘hello’
if greeting == ‘hello’
    student = {‘小萌’ : ‘1001’, ‘小智’ : ‘1002’ , ‘小强’ : ‘1003’ , ‘小张’ : ‘1004’}
    print(‘字典元素个数为:%d个 ’  %  len(student) )
    student.clear()
    print(‘字典删除后元素个数为:%d 个 ’  %  len(student))

字典元素个数为:4个
字典删除后元素个数为:0

此处的if语句块由多条语句组成,编写过程注意保持语句的缩进一致,否则在执行时会报错。

if语句的条件判定除了使用 == 外,还可以使用 > 、< 、>= 、 <=等条件符表示大小关系。除此之外,还可以使用各个函数或方法返回值作为条件判定。使用条件符的操作和使用 == 一样。

提示:

#! /uer/bin/python3
# -*-coding:UTF-8-*-

习惯写上这两行可以帮助在代码移植和编码问题上避免很多问题。代码移植时,如果从windows移植到Linux上,就必须加上第一行代码,代码总如有中文,如果不加第二行,就很容易出现乱码的情况。

2)else子句

之所以叫子句,是因为else不是独立语句,只能作为if语句的一部分。使用else子句可以增加一种选择。if语句块没有被执行,执行的就是else子句中的语句块。同if语句一样,else子句中的语句块也可以编写复杂语句。

3)elif子句

在else子句中,如果除if条件外,还有多个子条件需要判定时,可以使用elif,elif是else if的简写,意思为具有条件的else子句.

Python 中用 elif 代替了 else if,所以if语句的关键字为:if – elif – else。

#! /uer/bin/python3
# -*-coding:UTF-8-*-

num = 10
if num > 10 :
    print(‘num的值大于 10 ’)
elif 0 <= num <= 10 :
    print(‘num 的值介于010 之间’)
else:
    print(‘num的值小于 0’)

4)is 同一性

is运算符用于判定同一性而不是相等性。

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

变量x和y被绑定在同一个列表上,而变量z被绑定在另一个具有相同数量和顺序的列表上。他们的值可能相等,却不是同一个对象。也可以从内存的角度考虑,即他们所指向的内存空间不一样,x和y指向同一块内存空间,z指向另一块内存空间。

>>>x=[1,2,3]
>>>y=[1,5]
>>>x is not y
True
>>>del x[2]
>>>x
[1,2]
>>>y[1]=2
>>>y
[1,2]
>>>x == y
True
>>>x is y
False

使用==判定两个对象是否相等,使用is判定两个对象是否等同。

5)布尔运算符

and运算符用于连接两个布尔值,并在两者都为真时返回真,否则返回假。与and同类的还有or和not两个运算符。

布尔运算符还有一个有趣的特性:只有在需要求值时才求值。

如:表达式x and y需要两个变量都为真时才为真,所以如果x为假,表达式就立即返回flase,无论y的值是多少。实际上,如果x为假,表达式就会返回x的值,否则返回y的值。这种行为称为短路逻辑或惰性求值。布尔运算符通常被称为逻辑运算符,这种行为同样适用于or。在表达式x or y中,x为真时直接返回x的值,否则返回y值。

注意:
这意味着在布尔运算符后面的代码都不会被执行。

3、循环语句

1)for()

fields = [‘a’ , ‘b’ , ‘c’]
for f in fields:
print(‘当前字母是:’ , f)
当前字母是:a
当前字母是:b
当前字母是:c

该实例使用了for关键字。在Python中,for关键字叫做for循环,for循环可以遍历任何序列的项目,如一个列表或字符串。
for循环的语法格式为:

for iterating_var in sequence
     statements(s)

sequence是任意序列,iterating_var是序列中需要遍历的元素,statements是待执行的语句块。

首先对for条件判定,游标指向第0个位置,即指向第一个元素,看sequence序列中是否有元素,若有,则将元素值赋给iterating_var,接着执行语句块,若语句块中需要获取元素值,则使用iterating_var的值,执行完语句块后,将序列的游标往后在移一个位置,直到下一个位置没有元素时结束循环。

循环语句可以有 else 子句,它在穷尽列表(以for循环)或条件变为 false (以while循环)导致循环终止时被执行,但循环被break终止时不执行。

2)while()

在Python编程中,while语句用于循环执行程序,以处理需要重复处理的任务。另外,在Python中没有do..while循环。

while 判断条件 :
      执行语句 。。。

执行语句可以是单个语句或语句块。判断条件可以是任何表达式,所有非零、非空的值都为真,当判断条件为假时,循环结束。

首先对while条件判定,当条件为true时,执行条件语句块,执行完语句块在判定while条件,若仍然为true,则继续执行语句块,直到条件为flase时结束循环。

3)循环遍历字典元素

4)跳出循环

break和continue语句都是程序能够跳出部分代码。可以在switch语句或任何循环中使用。
break语句,是程序跳出switch或循环后面的语句处执行。

continue语句用于用于循环中,让程序跳出循环体中余下的代码,并开始新的一轮循环。
这里写图片描述

4、import

1)import…module

import()的标准语法为:

import module[ , module2[ , … moduleN ]]

表示一个import导入多个模块,但各个模块间需要用逗号隔开。

当解释器遇到import语句时,如果模块在当前搜索路径就会被导入。搜索路径是一个解释器,会先搜索所有目录的列表。

import  math
r = 5
print(‘半径为5的圆的面积为:%.2f’  %  (math.pi*r**2))
半径为5的圆的面积为:78.54

当我们使用import语句时,Python解释器怎样会找到对应的文件呢?这涉及Python的搜索路径,搜索路径由一系列目录名组成,Python解释器会依次从这些目录中寻找引入的模块。事实上可以通过定义环境变量的方式搜索路径,搜索路径是在Python编译或安装时确定的,被存储在sys模块的path变量中。

import  sys
print(‘Python的所搜路径为:  %s ’  %  sys.math)
Python的所搜路径为:[‘D:\\...’]

由以上输出结果看到,sys.math输出了一个列表,第一项输出的是执行文件所在的目录,即我们执行Python解释器的目录(如果是脚本,就是运行脚本所在的目录)。
可以在脚本中修改sys.path引入一些不在搜索路径中的模块。

2)from…import

除使用import引入模块外,还有另外一种方式引入模块:可以从一个导入语句中导入多个函数,多个函数之间用逗号分隔

from modname import name1[, name2[, ... nameN]]

Python的from语句让你从模块中导入一个指定的部分到当前命名空间中。
例如,要导入模块 fibo 的 fib 函数,使用如下语句:

>>> from fibo import fib, fib2
>>> fib(500)
1 1 2 3 5 8 13 21 34 55 89 144 233 377

在Python中,from语句可以从模块中导入指定部分到当前命名空间中,该语句不会将math整个模块导入,比如在math模块中还有sin、exp函数,在这个语句里这两个函数都使用不了,而在导入整个math模块的语句中可以使用。

>>>import  math
>>>print(math.pi)
3.1415926…
>>>print(math.sin(1))
0.8414709…

>>>from math import pi
>>>print(math.pi)
3.1415926…
>>>print(sin(1))
Traceback (most recent call last):
  File "<pyshell#3>", line 1, in <module>
    print(sin(1))
NameError: name 'sin' is not defined

如果导入模块,就会得到模块中所有对象;如果指定导入某个对象,就只能得到该对象。

>>>import math
>>>print(math.pi)
3.1415926…
>>>print(pi)
Traceback (most recent call last):
  File "<pyshell#3>", line 1, in <module>
    print(pi)
NameError: name 'pi' is not defined
>>> from math import pi
>>> print(pi)
3.141592653589793

由上面的输出结果可知,如果在导入math模块时访问pi对象,需要使用math.pi,直接使用pi访问不了,会报错;使用from import语句后,可以直接访问pi对象,不需要加上模块名进行访问。

from math import pi,sin

3)from…import *

把一个模块的所有内容全都导入到当前的命名空间也是可行的,只需使用如下声明:

from modname import *

这提供了一个简单的方法来导入一个模块中的所有项目。然而这种声明不该被过多地使用。
如果要访问模块中多个对象,可以直接使用*代替。

>>>from math import *
>>>print(pi)
3.141592653589793
print(sin(1))
0.8414709

由结果可以看到,pi、sin、exp等函数都可以被正确输出,这是一个简单地将项目所有模块都导入的方法,在实际开发中,这种声明不建议过多使用,这样不利于编写清晰、简单的代码,只有想通给定模块导入所有功能时才使用这种方式。

4)import…as…

除此之外,还可以给模块重命名,以及为函数重命名

>>>import math as m
>>>m.pi
3.141592653589793

from math import pi as p
>>>p
3.141592653589793

为函数重命名和为模块重命名的方式类似。
用逗号输出

>>>student = ‘小涛’
>>>print(‘学生称呼:’ , student)
学生称呼:小涛

>>>greeting = ‘大家好!’
>>>introduce = ‘我叫小涛,’
>>>comefrom = ‘我来自智慧城市。’
print(greeting, introduce, comefrom)
大家好!我叫小涛,我来自智慧城市。

这种方式可输出多个表达式,只要将多个表达式用逗号隔开就好了。

5、input

input()返回的数据类型是str,str不能直接和整数比较,必须先把str转换成整数。Python提供了int()函数来完成这件事情:

s = input('birth: ')
birth = int(s)
if birth < 2000:
    print('00前')
else:
    print('00后')

再次运行,就可以得到正确地结果。但是,如果输入abc呢?又会得到一个错误信息:

Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
ValueError: invalid literal for int() with base 10: 'abc'

原来int()函数发现一个字符串并不是合法的数字时就会报错,程序就退出了。

6、end关键字

关键字end可以用于将结果输出到同一行,或者在输出的末尾添加不同的字符,

#!/usr/bin/python3

# Fibonacci series: 斐波纳契数列
# 两个元素的总和确定了下一个数
a, b = 0, 1
while b < 1000:
    print(b, end=',')
    a, b = b, a+b

执行以上程序,输出结果为:

1,1,2,3,5,8,13,21,34,55,89,144,233,377,610,987,

7、pass语句

Python中的pass是一个空语句, pass不作任何事情,只是占位语句;保持程序结构完整,输出结果什么都没有做,在Python中空代码是非法的,解决的办法是在语句块中加一个pass语句。

name = ‘xiaomeng’
if name == ‘xiaomeng’:
   print(‘hello’)
else name == ‘xiaozhi’:
   #预留
else :
   print(‘nothing’)

File “text.py”,line 63
   else:
       ^
IndentationError:expected an endented block

name = ‘xiaomeng’
if name == ‘xiaomeng’:
   print(‘hello’)
else name == ‘xiaozhi’:
   #预留
   pass
else :
   print(‘nothing’)

hello

8、assert 断言

在没完善一个程序之前,我们不知道程序会在哪里出错,与其在运行时崩溃,不如在出现错误条件时就崩溃。一般来说,可以要求一些条件必须为真。

>>>x = 3
>>>assert x>0 , “x is not zero or negative”
>>>assert x%2 == 0 , “x is not an even number”
Traceback (most recent call last):
  File "<pyshell#5>", line 1, in <module>
    assert x%2 ==0 , "x is not an even number"
AssertionError: x is not an even number

当assert后面的条件为真时,程序正常运行;当assert后面的条件为假时,输出错误信息。错误提示信息由我们自己定义,这个错误提示信息可以成为异常参数。assert的异常参数是在断言表达式后添加的字符串信息,用于解释断言并更容易知道问题出在哪里。

使用assert断言是学习Python的好习惯,Python assert断言语句格式及用法很简单。

注意:

  • assert断言用于声明某个条件是真的;
  • 如果非常确信使用的列表中至少有一个元素,想要检验这一点,并在它非真时引发一个错误,那么assert语句是应用在这种情形下的理想语句;
  • assert语句失败时秒回引发一个AssertionError;

猜你喜欢

转载自blog.csdn.net/viatorsun/article/details/80217033
今日推荐