3.1变量、指和类型
变量可以将数据存储下来供我们在别的地方使用。它们是程序员手里的一个强大工具。如果你之前有过其它语言的编程经验,在这里你会发现Python个其它语言有点不同。
在Python解释器中输入语句:
>>> score = 0
它告诉Python你想使用一个名字为score,值为0的变量。在此之后,Python只要看到score,就会用值0来替换score。为了验证这一点,继续输入:
>>> print(score)
请记住,Python是顺序执行我们的命令的,在使用之前必须先给它赋值。否则,Python将会报错。
如果想改变score的值,只需要给它赋一个新值,如:
>>> score = 100
现在Python再遇到score时就会用100来替换它(你可以再次执行print(score)验证一下)。你也可以在更新它的值时使用它:
>>>score = score - 2
变量几乎可以使用任何名字但必须以字母或下划线开始,并且不能使用Python关键字(如if、while、elif、else、for)。Python的命名习惯是使用小写字母,用下划线将单词分开,如:
hight_score = 56
在前面的例子中所有的值都是数字,然而,值不只是数字,也可以是文字,如:
name = "xiaoming"
我们甚至可以把同一个变量轮换赋值成数字和文字,如:
>>> our_variable = 100
>>>print(out_variable)
>>> out_variable = "Some Text"
>>>print(our_variable)
然而,变量的当前值只能是一种类型。
3.1.1值和类型
看到数值3时,你只是看到一个3,而不关心它究竟是一个文字,还是一个数字。3就是3.Python却不一样。每个数据都有特性的类型,这样Python才知道如何处理它们。通过函数type()可以看到Python数据类型。在Python解释器中输入:
>>>type(3)
<class 'int'>
>>>type("3")
<class 'str'>
Python告诉我们第一个是int(integer的简写),第二个是str(字符string的简写)。这是因为Python认为整数3和字符3是不同的。执行下面这两行代码可以明显看出它们之间的区别:
>>> 3 + 3
6
>>> "3" + "3"
33
第一行将两个数字相加,而第二行却是将两个字符合并在一起,由此可见区分值的类型非常重要,如果出错,将会得到非常有意思的结果。为了探索更多的类型,可以输入:
>>>type(3.0)
<class 'float'>
>>>type(7 > 8)
<class 'bool'>
第一行输出float(一个浮点数表示一个实数,小数点位置不固定)。第二行输出bool(布尔类型,只有两个值,False和True)。
3.1.2数字排序
对于数子,可以有两种操作类型:比较和数值操作。比较,需要两个操作数,返回值为bool型。如下所示:
表3-1 数值类型的比较操作
操作符 | 含义 | 例子 |
< | 小于 | 7 < 8->True |
> | 大于 | 7 > 8-> False |
== | 等于 | 8 == 7-> False |
<= | 小于等于 | 8 <= 7->False |
>= | 大于等于 | 8 >= 7->True |
!= | 不等于 | 8 != 7-> True |
数值操作返回一个数值类型
表3-2 数值操作
操作符 | 含义 | 例子 |
+ | 加 | 2+3 -> 5 |
- | 减 | 5 -2 -> 3 |
* | 乘 | 2 * 3 -> 6 |
/ | 除 | 10 / 2 -> 5 |
% | 取余 | 2 % 3-> 2 |
** | 乘方 | 4 ** 2 - > 16 |
int | 转换为int | int(3.2) -> 3 |
float | 转换为float | float(3)->3.0 |
可以在Python解释器中输入任何一个操作符来验证一下,例如:
>>> 3 != 3
False
在程序中使用数值运算,通常都将其返回值赋值给一个变量,例如:
>>> x = 5 + 3
>>>y = 10
>>> k = y + x
3.1.3使用String保存文字
string类型可以用来保存任何文字。创建字符串只需要将数据用双引号或单引号括起来就可以了。在Python中,无论哪种引号都可以。我们首选双引号,因为它可以处理’号(单引号或者撇号)的字符串。但这绝不是普遍使用的。有些程序员喜欢使用单引号,因为其输入方便。
这个数据类型不同于其它类型,因为许多时候,string不只是单个数据而是一组字母。它的名字也反应了这个特点--字符"串",一串字符。
和数值类型一样,Python也为我们提供了一些操作方法。表3-3给出了一些常用的的操作。
表3-3 字符串操作
操作符 | 含义 | 例子 |
string[x] | 获取第x个字符(从0开始) | "abcde"[2]->"c" |
string[x:y] | 获取所有从x到y的字符 | "abcde"[1:3]->"bc" |
string[:x] | 获取从字符串开始到第y个的字符 | "abcde"[:3]->"abc" |
string[x:] | 获取从第x个开始到字符串结束的字符 | "abcde"[3:]->"de" |
len(string) | 返回字符串长度 | len("abcde")->5 |
string+string | 合并两个字符串 | "ab"+"cde"->"abcde" |
3.1.4布尔值:真或假
最后来看看bool类型。它非常简单,只有两种可能取值:True 和False。注意在Python中,这两个值的首字母要大写,并且不需要任何引号。同时这个值通常不存在变量中,它通常用于条件条件语句if的判断条件中。其操作符是与(and)、或(or)和非(not)。
非,就是简单地转换下取值:
>>> not True
False
>>>not False
True
3.1.5数据类型转换
使用int()、float()和str()可以转换数据类型。它们分别将其它类型转换为整型、浮点型及字符串。然而它们却不能随意转换。如果将浮点型转换为整型,Python将舍去所有小数部分。当字符串中只有一个字符时,才能转换为数字。但是其它类型几乎都可以转换为字符串。下面给出了一些例子:
>>>int(3.2)
3
>>>float(2)
2.0
>>>str(3.2)
3.2
3.1.6知识测试
下面是一些Python语句。看一下你是否能弄懂它们的意思。想出来什么意思之后,将它们输入Python解释器检验自己的判断。提示:有一些语句kennel会导致错误。
int("one")
print(str(3+3) + "3")
type(3=3)
"4" == 4
"Python"[4]
(3 > 2) or (2 > 3)
not "True"
2345[2]
str((not True) or (not False))
10 % 3
练习1
下面程序中哪些是变量,它们的值是什么,类型是什么?如果不确定,可以在代码中的某些地方加上print语句,并输入Python解释器中看看结果。当程序运行结果和我们期望的不一样时,这个方法很有用,可以确定某些代码究竟做了什么事。
prompt_text = "Enter a number:"
user_in = input(prompt_text)
user_num = int(user_in)
for i in range(1, 10)
print(i, " times", user_num, i * user_num)
even = (user_num % 2) == 0
if even:
print(user_num, " is even")
else:
print(user_num, " is odd")
3.2在结构体中存储值
除了简单的数据类型。Python还允许我们将数据用不同方式组合起来创建结构体。最简单的结构体是sequences(线性结构)。它将信息一个接一个地存储起来。它分为两类:lists(列表)和tuples(元组)。多数情况下,它们是相似的。
来看接下来的例子:
>>> list_1 = [1, 2, 3, 4, 5]
>>>tuple_1 = (1, 2, 3, 4, 5)
>>>list_1[1]
2
>>>tuple_1[2]
3
我们用方括号将数字括起来构成列表,用圆括号将数字括起来构成元组。到现在为止,它们两个工作起来是一致的。在结构体名后面跟方括号,方括号填下标就可以访问单个元素。注意下标从0开始,因此list_1[0]和tuple_1[0]可以访问线性结构中的第一个元素。
当你去更新元素时就会发现列表和元组间的差别:
>>>list_1[1] = 89
>>>list_1
[1, 89, 3, 4, 5]
>>>tuple_1[1] == 98
Traceback (most recent call last):
File "<pyshell#35>", line 1, in <module>
t1[1]=98
TypeError:"tuple" object does not support item assigment
可见,你可以更新列表中的单个元素,却不能更新元组中的元素。然而,你可以一次性覆盖元组中的所有元素。这时,可以告诉Python将变量tuple_1赋一个新值以取代旧值。
>>> tuple_1
(1, 2, 3, 4, 5)
>>>tuple_1 = (1, 99, 4, 5)
>>>tuple_1
(1, 99, 4, 5)
上一节中我们提到的strings就是一串字符,它的操作符可以用于列表和元组。下面继续以list_1盒tuple_1为例:
>>>len(list_1)
5
>>>tuple_1[:3]
(1, 99, 4)
参考表3-3,复习下我们可以在这里使用的字符串操作。
列表和元组中的元素可以是任意数据类型,包括列表和元组自身。如果愿意你可以创建列表的列表的列表。当然,如果真这样做了,你的代码将会变得非常难懂。但列表的列表,通常会比较有用。你可以把它当作二维表:
>>>list_2 = [[1, 11, 11], [2, 22, 23], [3, 32, 33,]]
你可以通过住列表和子列表索引来获取元素:
>>>list_2[1][1]
22
>>>list_2[1]
[2, 22,,23]
从列表3-4种就可以看出来为什么它可以当做二维表
表3-4 二维列表示例
list_2[0][0] = 1 | list_2[0][1] = 12 | list_2[0][2] = 13 |
list_2[1][0] = 2 | list_2[1][1] = 22 | lsit_2[1][2] =23 |
list_2[2][0] = 3 | list_2[2][1] = 32 | list_2[2][2] = 33 |
list_2[0][0] = 1 | list_2[1][0] = 2 | list_2[2][0] = 3 |
list_2[0][1] = 12 | list_2[1][1] = 22 | list_2[2][1] = 32 |
list_2[0][2] = 13 | lsit_2[1][2] = 23 | list_2[2][2] = 33 |
3.3控制程序流程
if语句
switch语句
while循环语句
for循环语句
3.4使用函数复用代码
py文件可看作模块(module),模块中可声明变量,定义函数,定义类,类中定义类方法。
模块中的函数及类中的方法统称为函数。
一个函数完成一个功能,可向函数传递参数,也可不传参数。
函数定义方式:
#模块中定义函数
def method():
print("This a method")
class People():
def __init__(self, name, age):
self.name = name
self.age = age
#类中定义方法
def setName(self, name):
self.name = name
def setAge(self, age):
self.age = age
def getName(self):
return self.name
def getAge(self):
return self.age
3.5组合装配
这一节我们实现一个学生管理小程序,把之前的知识点贯穿起来:
该程序包含一些默认数据并允许你修改它。我们将使用合适的数据类型和数据结构来存储不同的信息使用不同函数来操纵这些数据。我们添加了一个简单的菜单以方便用户管理这些数据。保存在一个文件中(Chapter3-5.py)
# _*_ coding:UTF-8 _*_
English = "English"
Maths = "Maths"
Chinese = "Chinese"
students = [["Ben", {English:56, Maths:78, Chinese:88}],
["Mark", {English:67, Maths:56, Chinese: 67}],
["Geography", {English:98, Maths:78, Chinese:89}],
["Paul", {English:99, Maths:45, Chinese:56}],
["Cao", {English:34, Maths:23, Chinese:67}]]
grades = ((0, "FALL"), (50, "D"), (60, "C"), (70, "B"), (80, "A"), (101, "CHEAT!"))
def print_record_card(report_student = None):
for student in students:
if (student[0] == report_student) or (report_student == None):
print("Report card for student ", student[0] )
for subject, mark in student[1].items():
for grade in grades:
if mark < grade[0]:
print subject, " : ", prev_grade
break
prev_grade = grade[1]
def add_student(student_name):
global students
for student in students:
if student[0] == student_name:
return student_name + " already in database"
students.append([student_name, {}])
return student_name + " added successfully"
def add_mark(student_name, subject, mark):
global students
for student in students:
if student[0] == student_name:
if subject in student[1].keys():
print(student_name, " already has a mark for ", subject)
#这里说明一下:input在Python3环境下是没问题,但在Python2环境下需要使用raw_input()
user_in = raw_input("Overwrite Y/N")
if user_in == "Y" or "y":
student[1][subject] = mark
return student_name + subject + " mark updated "
else:
return student_name + subject + " mark not updated"
else:
student[1][subject] = mark
return student_name + subject + " mark added"
return student_name + " not found"
while True:
print("Welcome to the Raspberry Pi student database")
print("What can l help you with?")
print("Enter 1 to view all report cards")
print("Enter 2 to view the report card for a student")
print("Enter 3 to add a student")
print("Enter 4 to add mark to a student")
print("Enter 5 to exit")
try :
user_choice = int(input("Choice: "))
except ValueError:
print("That is not a number I recognise")
user_choice = 0
if user_choice == 1:
print_record_card()
elif user_choice == 2:
#这里说明一下:input在Python3环境下是没问题,但在Python2环境下需要使用raw_input()
enter_student = raw_input("Which student?")
print_record_card(enter_student)
elif user_choice == 3:
#这里说明一下:input在Python3环境下是没问题,但在Python2环境下需要使用raw_input()
enter_student = raw_input("Student name ?")
print(add_student(enter_student))
elif user_choice == 4:
enter_student = raw_input("Student name? ")
enter_subject = raw_input("Subject? ")
number_error = True
while number_error:
number_error = False
try:
enter_mark = int(raw_input("mark"))
print(add_mark(enter_student, enter_subject, enter_mark))
except ValueError:
print(" I do not records that as a number")
number_error = True
elif user_choice == 5:
break
else:
print("Number is not found")
print
print("Goodbye and thank you for using the Raspberry Pi", "Student database")
3.6使用类来构建对象
class Person():
def __init__(self, age, name):
self.age = age
self.name = name
def getAge(self):
return self.age
def getName(self):
return self.name
def setAge(self, age):
self.age = age
def setName(self, name):
self.name = name
ben = Person(25, "Ben")
paul = Person(23, "Paul")
print(ben.name, ben.age)
print(paul.age, paul.name)
print ben.name, ben.age
print paul.name, paul.age
类的继承
class Person():
def __init__(self, name, age):
self.name = name
self.age = age
def birthday(self):
self.age = self.age + 1
class Parent(Person):
def __init__(self, name, age):
Person.__init__(self, name, age)
self.children = []
def add_child(self, child):
self.children.append(child)
def print_children(self):
for child in self.children:
print(child.name)
john = Parent("john", 23)
ben = Parent("ben", 22)
print(john.name, john.age)
john.add_child(ben)
john.print_children()
使用类重写了学生数据库,感受下类是如何工作的:
#学生类
class Student():
#初始化该学生
def __init__(self, name, marks):
self.name = name
self.marks = marks
#打印该学生的成绩
def print_report_card(self):
print("Report card for student ", self.name)
for subject, mark in self.marks.items():
for i in grades:
if mark < i[0]:
print subject, ":", pre_grade
break
pre_grade = i[1]
#添加该学生的成绩
def add_mark(self, subject, mark):
if subject in self.marks[0].keys():
print(subject, " already has a mark")
user_in = input("Overwrite Y/N")
if user_in == "Y" or user_in = "y":
self.marks[1][subject] = mark
return self.name + " " + subject + " mark updated"
else:
return self.name+ " " + subject + " mark not updated"
else:
self.marks[1][subject] = mark
return self.name + " " + subject + " mark added"
#一个班级或者一个学校的学生集合类
class Students():
def __init__(self, all_students):
self.students = []
for student in all_students:
pass
#添加一位新的学生
def add_student(self, student):
pass
#打印所有学生的成绩
def print_record_cards(self):
pass
#查找学生
def getStudent(self, name):
pass
#是否存在某位学生
def exits(self, student_name):
pass
while True:
#菜单说明语句
try:
user_choice = input("Choice")
except ValueError:
pass
if user_choice == 1:
#打印所有学生的成绩
elif user_choice == 2:
#打印某一位学生的所有成绩
elif user_choice == 3:
#添加一位新的学生
elif user_choice == 4:
#添加某一位学生的成绩
elif user_choice == 5:
#退出程序
break
else:
#输入了不存在的操作