简明Python教程 5)表达式 6)控制流 7)函数

本文详细介绍了Python中运算符与表达式的使用,包括加、减、乘、除等基本运算符,以及按位与、或、异或等位运算符,并阐述了运算符的优先级和结合规律。同时,文章还讲解了控制流语句的使用,如if、for、while等,以及如何使用它们改变程序执行流程。此外,还展示了如何通过函数实现代码复用,包括默认参数、关键参数、变量参数等功能。最后,文章通过实例演示了如何利用这些概念解决实际问题。

第5章 运算符与表达式

简介

表达式可以分解为运算符和操作数: 2+3 ; 

运算符是完成某件事, 由符号或者特定的关键字表示; 运算符需要数据来进行计算, 数据被称为操作数;

运算符

可以使用交互式的带提示符的python解释器: 

1
2
3
4
>>> 2 + 3
5
>>> 3 * 5
15

具体:

运算符 名称 说明 例子
+两个对象相加3 + 5得到8。'a' + 'b'得到'ab'。
-得到负数或是一个数减去另一个数-5.2得到一个负数。50 - 24得到26。
*两个数相乘或是返回一个被重复若干次的字符串2 * 3得到6。'la' * 3得到'lalala'。
**

返回x的y次幂

3 ** 4得到81(即3 * 3 * 3 * 3)
/x除以y4/3得到1(整数的除法得到整数结果)。4.0/3或4/3.0得到1.3333333333333333
//取整除返回商的整数部分4 // 3.0得到1.0
%取模返回除法的余数8%3得到2。-25.5%2.25得到1.5
<<左移把一个数的比特向左移一定数目(每个数在内存中都表示为比特或二进制数字,即0和1)2 << 2得到8。——2按比特表示为10
>>右移把一个数的比特向右移一定数目11 >> 1得到5。——11按比特表示为1011,向右移动1比特后得到101,即十进制的5。
&按位与数的按位与5 & 3得到1。
|按位或数的按位或5 | 3得到7。
^按位异或数的按位异或5 ^ 3得到6
~按位翻转x的按位翻转是-(x+1)~5得到-6。
<小于返回x是否小于y。所有比较运算符返回1表示真,返回0表示假。这分别与特殊的变量True和False等价。注意,这些变量名的大写。5 < 3返回0(即False)而3 < 5返回1(即True)。比较可以被任意连接:3 < 5 < 7返回True。
>大于返回x是否大于y5 > 3返回True。如果两个操作数都是数字,它们首先被转换为一个共同的类型。否则,它总是返回False。
<=小于等于返回x是否小于等于yx = 3; y = 6; x <= y返回True。
>=大于等于返回x是否大于等于yx = 4; y = 3; x >= y返回True。
==等于比较对象是否相等x = 2; y = 2; x == y返回True。x = 'str'; y = 'stR'; x == y返回False。x = 'str'; y = 'str'; x == y返回True。
!=不等于比较两个对象是否不相等x = 2; y = 3; x != y返回True。
not布尔“非”如果x为True,返回False。如果x为False,它返回True。x = True; not y返回False。
and布尔“与”如果x为False,x and y返回False,否则它返回y的计算值。x = False; y = True; x and y,由于x是False,返回False。在这里,Python不会计算y,因为它知道这个表达式的值肯定是False(因为x是False)。这个现象称为短路计算。
or布尔“或”如果x是True,它返回True,否则它返回y的计算值。x = True; y = False; x or y返回True。短路计算在这里也适用。

运算符优先级

下表给出python的运算符优先级, 上到下->从最低优先级(松散结合)到最高优先级(紧密结合);

建议使用圆括号来分组运算符和操作数, 明确指出运算的先后顺序, 使程序更加易读;

运算符 描述
lambdaLambda表达式
or布尔“或”
and布尔“与”
not x布尔“非”
in,not in成员测试
is,is not同一性测试
<,<=,>,>=,!=,==比较
|按位或
^按位异或
&按位与
<<,>>移位
+,-加法与减法
*,/,%乘法、除法与取余
+x,-x正负号
~x按位翻转
**指数
x.attribute属性参考
x[index]下标
x[index:index]寻址段
f(arguments...)函数调用
(experession,...)绑定或元组显示
[expression,...]列表显示
{key:datum,...}字典显示
'expression,...'字符串转换

计算顺序

使用圆括号改变运算符优先级表决定的计算顺序: (2+3)*4

结合规律

运算符通常由左向右结合; 2+3+4被计算成(2+3)+4 ;

一些如赋值运算符是由右向左结合的: a=b=c被处理为a=(b=c) ;

快捷方式

e.g. a = a*3 --> a *= 3

将 var = var operation expression 写成 var operator= expression ;


表达式

使用

1
2
3
4
5
6
7
#!/usr/bin/python
# Filename: expression.py
length = 5
breadth = 2
area = length * breadth
print ('Area is', area)
print ('Perimeter is'2 * (length + breadth))

输出:

Area is 10 
Perimeter is 14

>'完美打印' python会自动在输出的地方加上空格, 为了打印输出易读; 程序员无需考虑如何控制空格;


第6章 控制流

简介

控制流语句改变语句流的执行顺序: if, for, while ;


if语句

用来检测一个条件, 为真运行if-块, 否则处理else-块; else从句是可选的;

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
number = 23
= 0
while i != 1:
    try:
        guess = int(input('Enter an integer : '))
    except:
        print("please input a integer instead of string")
        break;
    if guess == number:
        print ('Congratulations, you guessed it.'# New block starts here
        print ("(but you do not win any prizes!)"# New block ends here
        = 1
    elif guess < number:
        print ('No, it is a little higher than that'# Another block
    # You can do whatever you want in a block ...
    else:
        print ('No, it is a little lower than that')
    # you must have guess > number to reach here
print ('Done')

>input()是内建函数build-in func; 字符串会被打印在屏幕上, 然后等待用户输入; 用户按回车之后, 函数返回输入; 对input函数来说取得的是字符串, 通过int把字符串转换为整数, 存储到变量guess中; int是一个类;

>使用缩进来告诉python每个语句属于哪一块; if语句在结尾处包含一个冒号: 通过冒号告诉python下面跟着一个语句块; if-elif-else把两个相关联的if else-if else语句合并; 也可以使用嵌套的if语句达到效果, elif和else是可选的;

可以在if语句的if块中存在另一个if语句, 这称为if语句嵌套;    

Note To C/C++ 在python中没有switch语句, 使用if..elif..else语句完成同样的工作; (某些场合使用字典会更快捷)


while语句

在一个条件为真的情况下, while语句允许重复执行一块代码; while语句属于循环语句, 有一个可选的else从句;

1
2
3
4
5
6
7
8
9
= 0
res = True
while res:
    += 1
    print(i)
    if i > 2:
        res = False
else:
    print("while loop over")

> True和False是布尔类型; 可以把它们等效地理解为1和0; 被使用在检验重要条件的时候, 它们并不是真实的值1; 与while同级的else块是可选的, 直接将语句跟在while语句之后有相同效果;

Note To C/C++ 可以在while循环中使用一个else从句;


for循环

for..in是循环语句, 在一序列的对象上, 递归/逐一使用队列中的每个项目;

1
2
3
4
for in range(15):
    print (i)
else:
    print ('The for loop is over')

>内建的range函数生成序列 [1, 2, 3, 4], 序列从第一个数开始到第二个数为止; [当i到达上限时, 序列结束]; range步长为1, 如果为range提供第三个数, 称为步长; e.g. range(1, 5, 2)输出 [1, 3]

如果想输出range: list(range(1,8))

Note 1) range序列不包含第二个数; 2) else部分是可选的, 如果包含else, 它总是在for循环结束后执行一次, 除非遇到break语句; 3) for...in循环对于任何类型的序列都适用;

Note To C/C++/Java/C# python的for循环从根本上不同与C/C++的; python的for循环与C#中的foreach循环类似; [C++现在也有foreach了...]; 对Java来说和1.5的for(int i : IntArray)类似; 对于C/C++, for(int i = 0; i < 5; i++), python对应的是for i in range(0, 5), 简单不易错;


break语句

用来终止循环语句, 即使循环条件没有False或序列还没有完全递归, 也会停止循环语句;

Note 如果从for或者while中break, 对应循环块的else块将不会执行;

1
2
3
4
5
6
7
while True:
    = input('Enter something : ')
    if == 'q':
        break
    print ('Length of the string is'len(s))
else:
    print ('Done')

>当用户输入是'q'时, 通过break终止循环到达程序结尾; break也跳过了else块;

>内建函数len()返回字符串的长度;


continue语句

告诉程序跳过当前循环块for/while中的剩余语句, 继续进行下一轮循环;

1
2
3
4
5
6
7
while True:
    = input('Enter something : ')
    if == 'quit':
        break
    if len(s) < 3:
        continue
    print ('Input is of sufficient length')

>当字符串长度大于或等于3时才会打印, 小于3时被continue跳过;


第7章 函数

简介

函数是重用的程序段: 允许给一块语句一个名称, 然后可以在程序的任何地方使用这个名称运行这个语句块, 这称为调用函数; e.g. 内建函数len(), range();

函数通过def关键字定义; def后跟一个函数的标识符名称, 然后圆括号, 括号内可以包括一些变量名, 该行以冒号结尾; 接下去是函数体语句;

定义

1
2
3
def sayHello():
    print 'Hello World!' # block belonging to the function
sayHello() # call the function

>无参数; 参数是给函数的输入, 传递不同的值得到相应结果;

函数形参

函数取得的参数是在调用时定义的, 不是在函数本身内赋值的; 参数在函数定义的括号内对内指定, 逗号分隔; 函数中的参数名称称为形参, 提供给函数调用的值称为实参;

使用

1
2
3
4
5
6
7
8
9
def printMax(a, b):
    if a > b:
        print (a, 'is maximum')
    else:
        print (b, 'is maximum')
 
printMax(34# directly give literal values
= 5; y = 7
printMax(x, y) # give variables as arguments

>直接提供实参或者使用变量传值;


局部变量

函数定义内声明的变量, 和函数外具有相同名称的变量无关, 变量对于函数来说是局部的; 作用域是被定义的块--函数内部;

1
2
3
4
5
6
7
8
def func(x):
    print ('x is', x)
    = 2
    print ('Changed local x to', x)
 
= 50
func(x)
print ('x is still', x)

Note 变量值不受函数内部局部变量影响;

global语句

如果想要为一个定义在函数外的变量赋值, 就需要告诉python这个变量不是局部而是全局的; 

可以使用定义在函数外的变量的值(假设函数内没有同名变量); 但是应该避免这样做, 这样会使得程序不清楚, 变量到底是在哪里定义的; 使用global语句清楚表明变量在函数外部定义;

1
2
3
4
5
6
7
8
def func():
    global x
    print ('x is', x)
    = 2
    print ('Changed local x to', x)
 
= 50; func()
print ('Value of x is', x)

Note global语句声明x是全局的, 当在函数内赋值给x时, 这个变化也反映在主块中x的值;

>可以使用global关键字指定多个局部变量, e.g. global x, y, z;


默认参数值

在函数定义的形参后面加上赋值运算符= 和默认值, 给形参指定默认参数值; 使得函数内的一些参数是可选的, 用户可以不用输入而使用默认值;

Note 默认参数值是不可变的;

1
2
3
4
def say(message, times = 1):
    print (message * times)
say('Hello')
say('World'5)

Note 只有在形参表末尾的参数可以有默认值; e.g. def func(a, b=5)正确, def func(a=5, b)错误;

关键参数

通过命名来为函数中的一部分参数赋值; 使用名字(关键字)而不是通过位置来给函数指定实参;

优点: 1) 不必担心参数的顺序, 使用函数更简单; 2) 假如有些参数有默认值, 可以只给需要的参数赋值;

1
2
3
4
5
def func(a, b=5, c=10):
    print ('a is', a, 'and b is', b, 'and c is', c)
func(37)
func(25, c=24)
func(c=50, a=100)

>可以不按顺序灵活指定参数值;


变量参数

定义一个函数, 可以获取参数的任何值, 通过星号实现;

1
2
3
4
5
6
7
8
9
def total(initial=5*numbers, **keywords):
    count = initial
    for number in numbers:
        count += number
    for key in keywords:
        count += keywords[key]
    return count
 
print(total(10123, vegetables=50, fruits=100))

>声明一个星号参数 *param, 从这一点开始到结束的所有位置的参数都被收集到名为param的元组中;

>声明一个双星参数 **param, 从这一点到结束的所有关键字都被收集到名为param的字典中;

只有关键字的参数

想要指定特定的关键字参数作为只有关键字的参数, 而不是位置参数, 他们可以被声明在星号参数后;

1
2
3
4
5
6
7
8
9
10
def total(initial=5*numbers, extra_number):
    count = initial
    for number in numbers:
        count += number
    count += extra_number
    print(count)
 
total(10123, extra_number=50)
total(10123)
# Raises error because we have not supplied a default argument value for 'extra_number'

>在星号参数后声明的参数, 只有关键字参数, 并且必须提供值;

如果不需要星号参数, 但还是想使用只有关键字的参数, 可以用星号代替参数: def test(init=5, *, extra_num);


return语句

从一个函数返回/跳出; 返回值可选;

1
2
3
4
5
6
7
8
def maximum(x, y):
    if == y :
        return
    elif x > y:
        return x
    else:
        return y
print (maximum(33))

>输出:None;

Note 没有返回值的return语句等价于return None ; None是python中表示没有任何东西的特殊类型; e.g. 变量的值为None, 表示没有值;

除非显式提供return语句, 否则每个函数在结尾隐式地含有 return None语句;

1
2
3
def someFunc():
    pass
print (someFunc())

>输出为None; py中已经有了内建的mx函数, 尽量使用内建函数;

Note pass语句在python中表示一个空的语句块;


文档字符串DocStrings

python的特性, 文档字符串, document strings简称为docstrings;docStrings是一个帮助简化程序文档的工具; 甚至可以在程序运行时从函数恢复文档字符串;

1
2
3
4
5
6
7
8
9
10
11
12
def printMax(x, y):
    '''Prints the maximum of two numbers.
 
    The two values must be integers.'''
    = int(x) # convert to integers, if possible
    = int(y)
    if x > y:
        print (x, 'is maximum')
    else:
        print (y, 'is maximum')
printMax(35)
print (printMax.__doc__)

函数的第一个逻辑行的字符串是这函数的文档字符串, docStrings也适用于模块和类;

Note 文档字符串的惯例是一个多行字符串, 首行以大写字母开始, 句号结尾; 第二行空行, 第三行开始详细的描述; 建议遵循此惯例;

__doc__(双下划线)调用printMax函数的文档字符串属性(属于函数的名称); python把一切都作为对象, 包括这个函数; python中的help()使用的就是docStrings, 抓取函数的__doc__属性, 整理展示; 按q退出help, help也可以显示自定义函数的文档: help(printMax);

自动化工具也可以从__doc__提取文档, 建议给正式函数都编写文档字符串; 随python发行版附带的pydoc命令, 与help()类似地使用docStrings;

---TBC---YC

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值