Python3.7编程快速入门
上QQ阅读APP看书,第一时间看更新

第2章 Python基础知识

学习一门语言,最基础的就是语法,一般就是数据类型、流程控制等。学习过其他语言的读者,可以在本章看看Python语言与其他语言的区别;没有学习过其他语言的读者,则需要在本章加强代码的练习。

本章的主要内容是:

  • PyShell的使用。
  • Python中的数值、字符串。
  • 列表的使用。
  • 流程控制。
  • 函数的学习。

2.1 Python的基础简介

前面学习了很多Python的理论知识,本节开始增加动手能力,先从1+1开始吧!

2.1.1 启动Python解释器

打开IDEL后,会出现主提示符“>>>”,表示Python解释器已经启动起来了,解释器的行为就像是一个计算器。我们可以向它输入一个表达式,它会返回结果,例如:

     >>> 1+1
     2
     >>> 2*3
     6
     >>> 4-5
     -1

表达式的语法和大多数计算机语言是一样的,具有各种数字类型和四则运算,也可以使用括号来划分表达式的优先级,例如:

     >>> (1+2)*3
     9
     >>> 3-(2+4)*2
     -9

2.1.2 数值类型

可以尝试在Python解释器下输入各种类型的数值,不只是整数,也可以是小数,甚至可以是复数,例如:

     >>> a=3
     >>> b=3.246
     >>> c=5+1j
     >>> print(c)
     (5+1j)
     >>> print(b)
     3.246
     >>> print(a)
     3

在上面的代码中,a是整数,b是小数,c是复数,复数由两部分组成,虚部由一个后缀“j”或者“J”来表示。带有非零实部的复数记为“(real+imagj)”,符号“=”是绑定的意思,意思就是说,a以后和数字3绑定在一起了,只要提到a,就知道它是数字3,当然绑定是可以随时改变的,a可以和数字3绑定在一起,也可以和其他数绑定在一起,例如:

     >>> a=3
     >>> a=3.5

同一个值可以同时赋给几个变量:

     >>> x = y = z = 0  # x、y、z都是0
     >>> x
     0
     >>> y
     0
     >>> z
     0

不同的值也可以方便和几个不同的变量相绑定,例如:

     >>> a,b,c=4,5,6
     >>> a
     4
     >>> b
     5
     >>> c
     6

2.1.3 字符串

在Python中,带单引号或者双引号的都是字符串,在Python中没有字符这个概念,单个字符也认为是字符串,例如:

     >>> bb='china'
     >>> aa="china"
     >>> aa
     'china'
     >>> bb
     'china'

字符串可以通过几种方式分行。可以在行尾加反斜杠作为继续符,这表示下一行是当前行的逻辑延续,例如:

     >>> hello = "这是第1行\n\
     ...这是第2行\n\
     ...这是第3行\
     ...结束。"
     >>>

或者字符串可以用一对三重引号""""或'''来标识。三重引号中的字符串在行尾不需要换行标记,所有的格式都会包括在字符串中,例如:

     >>> hello = """希望你学的开心
      Python并不难。
      一个小小的提示:
      开心就好。"""
     >>>

字符串可以用+号连接(或者说黏合),也可以用*号循环,例如:

     >>> word = 'Help' + 'A'
     >>> word
     'HelpA'
     >>> '<' + word*5 + '>'
     '<HelpAHelpAHelpAHelpAHelpA>'

也可以使用字符串自带的方法来进行英文大小写转换。例如,upper()是转换成大写,而lower()是转换成小写:

     >>> e_str='china'
     >>> e_str.upper()
     'CHINA'
     >>> hh=e_str.upper()
     >>> print(hh)
     CHINA
     >>> hh.lower()
     'china'

字符串可以用下标(索引)查询;就像C一样,字符串的第一个字符下标是0。这里没有独立的字符类型,字符仅仅是大小为一的字符串。就像在Icon中那样,字符串的子串可以通过切片标志来表示,两个由冒号隔开的索引,例如:

     >>> hh.lower()
     'china'
     >>> word='Help'
     >>> word[3]
     'p'
     >>> word[0:2]
     'He'
     >>> word[2:4]
     'lp'

说明

切片(Slice),简单理解的话可以是截取,比如10个字母只截取中间的3个。Python中的切片操作符是[],里面使用数字,用冒号间隔,表示从第几位到第几位。如果没有冒号,只有1个数字,表示从第1个(下标为0)开始截取。

需要注意的是,字符串是不可以更改的,可以创建新的字符串,但是绝不能更改存在的字符串,例如:

     >>> word[3]='P'
     Traceback (most recent call last):
       File "<stdio>", line 1, in <module>
     TypeError: 'str' object does not support item assignment
     >>> word[0]='h'
     Traceback (most recent call last):
       File "<stdio>", line 1, in <module>
     TypeError: 'str' object does not support item assignment

可以使用已经存在的字符串去合并新的字符串,例如:

     >>> 'h'+word[1:]
     'help'

2.1.4 列表

列表是Python中的容器,用于组织其他的值,为中括号之间用逗号分隔的一列值(子项)。列表的子项不一定是同一类型的值,例如:

     >>> aa=['china',2,3,4]
     >>> aa
     ['china', 2, 3, 4]

像字符串一样,列表也以0开始,可以被切片、连接等:

     >>> a=['spam', 'eggs', 100, 1234]
     >>> a[0]
     'spam'
     >>> a[3]
     1234
     >>> a[-2]
     100
     >>> a[1:-1]
     ['eggs', 100]
     >>> a[:2] + ['bacon', 2*2]
     ['spam', 'eggs', 'bacon', 4]
     >>> 3*a[:3] + ['Boe!']
     ['spam', 'eggs', 100, 'spam', 'eggs', 100, 'spam', 'eggs', 100, 'Boe!']

与不变的字符串不同,列表可以改变每个独立元素的值:

     >>> a[2] = a[2] + 23
     >>> a
     ['spam', 'eggs', 123, 1234]

列表可以进行切片操作,甚至可以改变列表的大小:

     >>> #替换列表项
     ... a[0:2] = [1, 12]
     >>> a=[1, 12, 123, 1234]
     >>> # 移动列表项
     ... a[0:2] = []
     >>> a
     [123, 1234]
     >>> # Insert some:
     ... a[1:1] = ['bletch', 'xy777']
     >>> a
     [123, 'bletch', 'xy777', 1234]
     >>> a[:0] = a     #在开始处插入
     >>> a
     [123, 'bletch', 'xy777', 1234, 123, 'bletch', 'xy777', 1234]

说明

本书第3章会详细介绍列表类型的使用,在这里简略介绍,也是因为后面的例子会用到。

2.1.5 流程控制

流程控制最重要的是两种流程控制方式:

  • 选择语句
  • 循环语句

提示

本章的流程控制和函数等相关技术点只是方便本章后面的案例编码,让读者可以有简单的了解,详细技术点的分析会在后面的章节逐步展开。

1. 选择语句

Python提供了if...elif...else语句进行选择分支,例如:

     >>> x = int(input("输入一个数字: "))
     >>> if x < 0:
     ...      x = 0
     ...      print('不能小于0')
     ... elif x == 0:
     ...      print(0)
     ... elif x %2 == 1:
     ...      print("单数")
     ... else:
     ...      print("其他")
     ...

关键字“elif”是“else if”的缩写,可以有效避免过深的缩进。

2. 循环语句

Python提供了几个不同的循环语句,最主要的有for和while语句。通常的循环可能会依据一个等差数值步进过程(如Pascal)或由用户来定义迭代步骤和中止条件(如C),Python的for语句依据任意序列(列表或字符串)中的子项,按它们在序列中的顺序来进行迭代。例如:

     >>> a = ['cat', 'Windows', 'defenestrate']
     >>> for x in a:
     ...     print(x, len(x))
     ...
     cat 3
     Windows 7
     defenestrate 12

在迭代过程中修改迭代序列不安全(只有在使用列表这样的可变序列时,才会有这样的情况)。如果想要修改迭代的序列(例如,复制选择项),可以迭代它的复本。通常使用切片标识就可以很方便地做到这一点:

     >>> for x in a[:]:
     ...    if len(x) > 6:
     ...        a.insert(0, x)
     ...
     >>> a
     ['defenestrate', 'cat', 'Windows', 'defenestrate']

Python中的while语句和C中使用的很相似,都是在while关键字后加一个循环表达式,当循环表达式为真或者True的时候,会一直循环着,当循环表达式为False的时候,会退出循环,例如:

     >>> i=0
     >>> while i<5:
     ...     print(i)
     ...     i+=1
     ...
     0
     1
     2
     3
     4

2.1.6 函数

函数定义的关键字是def,在其后必须跟有函数名和包括形式参数的圆括号。函数体语句从下一行开始,必须是缩进的。函数体的第一行可以是一个字符串值,这个字符串是该函数的文档字符串,也可称作docstring,相当于代码的注释,代码中加入文档字符串是一个好的做法,应该养成习惯。

调用函数时会为局部变量引入一个新的符号表。所有的局部变量都存储在这个局部符号表中。引用参数时,会先从局部符号表中查找,再是全局符号表,然后是内置命名表。因此,全局参数虽然可以被引用,但是不能在函数中直接赋值(除非它们用global语句命名)。

函数引用的实际参数在函数调用时引入局部符号表,因此实参总是传值调用(这里的值总是一个对象引用,而不是该对象的值)。一个函数被另一个函数调用时,一个新的局部符号表在调用过程中被创建。

函数定义在当前符号表中引入函数名。作为用户定义函数,函数名有一个为解释器认可的类型值。这个值可以赋给其他命名,使其能够作为一个函数来使用。这就像一个重命名机制,例如定义一个计算斐波那契数列的函数:

     >>> def fib(n):
              a, b = 0, 1
          while b < n:
              print(b)
              a, b = b, a+b

提示

斐波那契数列(Fibonacci sequence)又称为黄金分割数列,指的是这样一个数列:1、1、2、3、5、8、13、21、34……

既可以直接调用该函数,也可以将函数作为值赋给其他变量:

     >>> fib
     <function object at 10042ed0>
     >>> f = fib
     >>> f(100)
     1 1 2 3 5 8 13 21 34 55 89

2.2 开始编程:九九乘法表

在2.1节中,初步介绍了Python编程的一些基础语法知识,本节将应用Python的这些基础知识来编程实现一个简单的九九乘法表。

【本节代码参考:C02\py_2.1.py】

2.2.1 九九乘法表

九九乘法表是将10之内的数互相相乘的结果以三角形的样式打印出来,在本节的应用中,不只是要将九九乘法表以三角形的样式打印出来,还需要以倒三角形来打印九九乘法表。

2.2.2 编程思路

要以三角形、倒三角形的样式来打印九九乘法表,关键的编程要点有两个:

  • 获得所有10之内乘法的运算式和结果。
  • 将运算式和结果排版成正三角和倒三角的形式。

要获得所有10之内的乘法运算式和结果,最简单的方法是通过循环来实现,通过两个变量,让它们都在10之内双重循环,然后计算它们的结果,这样就可以得到10之内所有的运算式和结果,代码如下:

     >>> def getall():
     ...     lis=[]
     ...     for i in range(1,10):
     ...      for j in range(1,i+!):
     ...          lis.append(str(i)+"*"+str(j)+"="+str(i*j))
     ...  return lis

函数getall使用了一个双重循环,该循环的作用就是将10之内互乘的运算式和结果都存放到列表lis中,这样就可以使用getall的返回值获得所有的互乘的运算式和结果,例如:

    >>> getall()
    ['1*1=1', '2*1=2', '2*2=4', '3*1=3', '3*2=6', '3*3=9', '4*1=4', '4*2=8',
'4*3=12', '4*4=16', '5*1=5', '5*2=10', '5*3=15', '5*4=20', '5*5=25', '6*1=6',
'6*2=12', '6*3=18', '6*4=24', '6*5=30', '6*6=36', '7*1=7', '7*2=14', '7*3=21',
'7*4=28', '7*5=35', '7*6=42', '7*7=49', '8*1=8', '8*2=16', '8*3=24', '8*4=32',
'8*5=40', '8*6=48', '8*7=56', '8*8=64', '9*1=9', '9*2=18', '9*3=27', '9*4=36',
'9*5=45', '9*6=54', '9*7=63', '9*8=72', '9*9=81']

有了所有的互乘的运算式和结果,下面的工作就是如何组织这些运算式来排列成三角形和倒三角形,也就是说,要将列表lis的元素按照一定的规律输出到屏幕就可以了。

2.2.3 编程实现

九九乘法表使用最简单的for循环,还利用了Python特有的变量类型——列表。程序很简单,保存为py_2.1.py,运行例子2.1将九九乘法表输出到终端。

例子2.1 Python打印九九乘法表

可以在命令行执行命令:

     python py_2.1.py

也可以在IDEL中单击File|New File打开编辑器,输入上述内容,保存为py_2.1.py后,按F5键运行。

执行结果如图2.1所示。

图2.1 九九乘法表

在例子2.1的第13行中,利用list列表的reverse()将列表中的元素倒置,然后利用pop()将元素逐个“吐”出并输出到屏幕上。

注意

第1行一般应用在多个Python版本的环境下,指明使用的具体Python解释器。如果读者机器上只有一个Python版本,或者是通过IDEL进行编辑,就可以省略这1行。

2.3 本章小结

本章介绍了Python的基本知识,并安装好了Python的环境,用一个简单的程序展示了Python程序的流程控制。