2020-11-16

Python编程从入门到实践

Chapter 2 变量和简单数据类型

一、变量

  message="Hello Python world"
  print(message)

  message="Hello Python Crash Course world"
  print(message)


  Results:Hello Python world
          Hello Python Crash Course world

1.变量名的命名和使用

请务必牢记下述有关变量的规则:

(1)变量名只能包含字母、数字和下划线。变量名可以字母或下划线打头,但不能以数字打头。

(2)变量名不能包含空格,但可以使用下划线来分隔其中的单词。

(3)不要将Python的关键字和函数名作变量名。

(4)变量名应既简短又具有描述性。

(5)慎用小写字母l和大写字母O,因为它们可能被人错看成数字1和0。

2.使用变量时避免命名错误

二、字符串

字符串是一种数据类型,它就是一系列字符。在Python中,用引号括起来的都是字符串,其中的引号可以是单引号,也可以是双引号,如下所示:

  "This is a string"
  'This is also a string'

1.使用方法修改字符串的大小写

name.py

name="ada lovelace"
print(name.title())


Ada Lovelace

在print()语句中,方法title()出现在这个变量的后面。方法是Python可对数据执行的操作。在name.title()中,name后面的句点(.)让Python对变量name执行方法title()指定的操作。每个方法后面都跟着一对括号,这是因为方法通常需要额外的信息来完成其工作。这种信息是在括号内提供的。函数title()不需要提供额外的信息,因此他后面的括号是空的。

Summary:1.title()以首字母大写的方式显示每个单词,即将每个单词的首字母都改为大写。
2.upper()将字符串改为全部大写
3.lower()将字符串改为全部小写

2.合并(拼接)字符串

Python使用加号(+)来合并字符串

first_name="ada"
last_name="lovelace"
full_name=first_name+" "+last_name

message="Hello,"+full_name.title()+"!"
print(message)


"Hello,Ada Lovelace!"

3.使用制表符或换行符来添加空白

在编程中,空白泛指任何非打印字符,如空格、制表符和换行符。
制表符:\t
换行符:\n

Example:

print("Language:\n\tPython\n\tC\n\tJavascript")


Languages:
    Python
    C
    Javascript

4.删除空白

‘python’和’python ‘看起来几乎没有什么区别,但对程序而言,它们却是两个不同的字符串。Python能发现 ‘python ‘中额外的空白,并认为它是有意义的——除非你告诉它不是这样的。

Python能够找出字符串开头和末尾多余的空白。要确保字符串末尾没有空白,可使用方法rstrip()

favorite_language='python '
print(favorite_language)

'python '

如果

print(favorite_language.rstrip())


'python'

注意:rstrip()这种删除只是暂时的,接下来再次询问favorite_language的值时,你会发现这个字符串和输入时一样,依然包含多余的空格。

要永久删除这个字符串中的空白,必须将删除操作的结果存回到变量中:

favorite_language='python '
favorite_language=favorite_language.rstrip()
print(favorite_language)


'python'

我们还可以剔除字符串开头的空白,或同时剔除字符串两端的空白。为此,可分别使用方法
lstrip()和strip():

>>>favorite_language=' python '
>>>favorite_language.rstrip()
' python'
>>>favorite_language.lstrip()
'python '
>>>favorite_language.strip()
'python'

5.使用字符串时避免语法错误

程序中包含非法的Python代码时,就会导致语法错误。

三、数字

在编程中,经常使用数字来记录游戏得分、表示可视化数据、存储Web应用信息。

1.整数

(1)在Python中,可对整数执行加(+)减(-)乘(*)除(/)乘方(**)运算。
(2)Python还支持运算优先级,因此你可在同一个表达式中使用多种运算。还可以使用括号来修改运算优先级,让Python按你指定的次序执行运算。
(3)空格不影响Python计算表达式的方式。

2.浮点数

Python将带小数点的数字都称为浮点数。
注意:结果包含的小数位可能是不确定的:

>>>0.2 + 0.1
0.30000000000000004
>>>3 * 0.1
0.30000000000000004

所有语言都存在这个问题,就现在而言,暂时忽略多余的小数位即可。

3.使用函数str()避免类型错误

可调用str(),它让Python将非字符串值表示为字符串(比如下例没有str()会报错):

age=23
message="Happy "+str(age)+"rd Birthday!"
print(message)


Happy 23rd Birthday!

4.注释

在Python在,注释用#标识,#后面的内容都会被Python解释器忽略(仅限这一行代码),如果要多行注释,用三引号””” “””,将要注释的代码插在三引号中间。

Chapter 3 列表简介

一、列表是什么

列表由一系列按特定顺序排列的元素组成。你可以创建包含字母表中所有的字母、数字0~9、或所有家庭成员姓名的列表;也可以将任何大写加入了列表中,,其中的元素之间可以没有任何关系。

在Python中,用方括号([])来表示列表,并用逗号来分割其中的元素。
bicycles.py

bicycles=['trek','cannondale','redline','specialized']
print(bicycles)

如果你让Python将列表打印出来,Python将打印列表的内部表示,包括方括号:

['trek','cannondale','redline','specialized']

1.访问列表元素

列表是有序集合,因此要访问列表的任何元素,只需将该元素的位置或者索引告诉Python即可。要访问列表元素,可指出列表的名称,再指出元素的索引,并将其放在方括号内。

bicycles=['trek','cannondale','redline','specialized']
print(bicycles[0])


trek

你还可以对任何列表元素调用第2章介绍的字符串方法。例如:

bicycles=['trek','cannondale','redline','specialized']
print(bicycles[0].title())


Trek

2.索引从0而不是1开始

在Python中,第一个列表元素的索引为0,而不是1。

bicycles=['trek','cannondale','redline','specialized']
print(bicycles[1])
print(bicycles[3])


cannondale
specialized

注:Python为访问最后一个列表元素提供了一种特殊语法。通过将索引指定为-1,可让Python回到最后一个列表元素,索引-2返回倒数第二个列表元素,以此类推。

3.使用列表中的各个值

bicycles=['trek','cannondale','redline','specialized']
message="My first bicycle was a "+bicycles[0].title()+"."
print(message)


My first bicycle was a Trek.

二、修改、添加和删除元素

你创建的大多数列表都将是动态的,这意味着列表创建后,将随着程序的运行增删元素。

1.修改列表元素

motorcycles.py

motorcycles=['honda','yamaha','suzuki']
print(motorcycles)

motorcycles[0]='ducati'
print(motorcycles)


['honda','yamaha','suzuki']
['ducati','yamaha','suzuki']

2.在列表中添加元素

(1)在列表末尾添加元素

使用方法append.()

motorcycles=['honda','yamaha','suzuki']
motorcycles.append('ducati')
print(motorcycles)


['honda','yamaha','suzuki','ducati']

方法append()让动态地创建列表易如反掌,例如,你可以先创建一个空列表,再使用一系列的append()语句添加元素。

motorcycles=[]

motorcycles.append('honda')
motorcycles.append('yamaha')
motorcycles.append('suzuki')

print(motorcycles)


['honda','yamaha','suzuki']
(2)在列表中插入元素

使用方法insert()

motorcycles=['honda','yamaha','suzuki']

motorcycles.insert(0,'ducati')
print(motorcycles)


['honda','yamaha','suzuki','ducati']

3.从列表中删除元素

(1)使用del语句删除元素

如果知道要删除的元素在列表中的位置,可使用del语句

motorcycles=['honda','yamaha','suzuki']

del motorcycles[0]
print(motorcycles)


['yamaha','suzuki']

注:1.使用del可删除任何位置处的列表元素,条件是知道索引;
2.使用del语句将值从列表中删除后,你就无法再访问它了。

(2)使用方法pop()删除元素

方法pop()可删除列表末尾的元素,并让你能够接着使用它:列表就像一个栈,而删除列表末尾的元素相当于弹出栈顶元素。

motorcycles=['honda','yamaha','suzuki']
popped_motorcycle=motorcycles.pop()
print(motorcycles)
print(popped_motorcycle)


['honda','yamaha']
suzuki
(3)弹出列表中任何位置处的元素
motorcycles=['honda','yamaha','suzuki']
first_owned=motorcycles.pop(0)
print('The first motorcycle I owned was a '+first_owned.title()+'.')


The first motorcycle I owned was a Honda.

注:下面有个对于选择del语句还是pop()方法有一个简单的判断标准:如果你要从列表中删除一个元素,且不再以任何方式使用它,就使用del语句;如果你要在删除元素后还能继续使用它,就使用方法pop()。

(4)根据值删除元素

如果不知道要从列表中删除的值所处的位置,只知道要删除的元素的值,可使用方法remove():

motorcycles=['honda','yamaha','suzuki','ducati']
motorcycles.remove('ducati')
print(motorcycles)


['honda','yamaha','suzuki']

注:方法remove()只删除第一个指定的值。如果要删除的值可能在列表中出现多次,就需要使用循环来判断是否删除了所有这样的值。

3.组织列表

(1)使用方法sort()对列表进行永久性排序

方法sort()永久性地修改了列表元素的排列顺序
cars.py

cars=['bwm','audi','toyota','subaru']
cars.sort()
print(cars)


['audi','bwm','subaru','toyota']

你还可以按与字母顺序相反的顺序排列列表元素,为此,只需向sort()方法传递参数reverse=True。下面的示例将汽车列表按语字母顺序相反的顺序排列:

cars=['bwm','audi','toyota','subaru']
cars.sort(reverse=True)
print(cars)


['yoyota','subaru','bmw','audi']

注:sort()对列表元素排列顺序的修改是永久性的。

(2)使用函数sorted()对列表进行临时排序
cars=['bwm','audi','toyota','subaru']
print(sorted(cars))
print(cars)


['audi','bwm','subaru','toyota']
['bwm','audi','toyota','subaru']

注:调用函数sorted()后,列表元素的排列顺序并没有变。

(3)倒着打印列表

使用方法reverse():

cars=['bwm','audi','toyota','subaru']
cars.reverse()
print(cars)


['subaru','toyota','audi','bwm']

注:1.reverse()不是指按与字母字母顺序相反的顺序排列列表元素,而只是反转列表元素的排列顺序
2.方法reverse()永久性地修改列表元素的排列顺序

(4)确定列表的长度

使用函数len()可快速获悉列表的长度

>>>cars=['bwm','audi','toyota','subaru']
>>>len(cars)
4

4.使用列表是避免索引错误

注:发生索引错误却找不到解决办法时,请尝试将列表或其长度打印出来。

Chapter 4 操作列表

一、遍历整个列表

下面先介绍一个例子,使用for循环来打印魔术师名单里的所有名字:
magincians.py

magicians=['alice','david','carolina']
for magician in magicians:
    print(magician)


alice
david
carolina

1.深入地研究循环

几个注意的点:1.Python首先读取for循环开始时的第一行代码,再继续到下一行
2.Python在上述例子中执行到列表中的最后一个元素然后结束循环指令,如果没有后续循环外的代码就结束程序
3.Python中的循环范围取决于print之前的缩进,有缩进就属于循环,没有缩进就为循环外的代码

2.在for循环中执行更多的操作

在for语句后面,每个缩进的代码都是循环的一部分,且将针对列表中的每个值都执行一次。

3.在for循环结束后执行一些操作

在for循环后面,没有缩进的代码都只执行一次,且不会重复执行。

二、避免缩进错误

Python根据缩进来判断代码行与前一个代码行的关系。

1.忘记缩进

2.忘记缩进额外的代码行

3.不必要的缩进

4.循环后不必要的缩进

5.遗漏了冒号

三、创建数字列表

1.使用函数range()

Python函数range()让你能够轻松地生成一系列的数字。例如下面使用函数range()来打印一系列的数字:
numbers.py

for value in range(1,5):
    print(value)


1
2
3
4

注:函数range()让Python从你指定的第一个值开始数,并在到达你指定的第二个值后停止,因此输出不包含第二个值(这里为5)。

2.使用range()创建数字列表

要创建数字列表,可使用函数list()将range()的结果直接转换为列表。

numbers=list(range(1,6))
print(numbers)


[1,2,3,4,5]

使用函数range()时,还可以指定步长。例如:
even_numbers.py

even_numbers=list(range(2,11,2))
print(even_numbers)


[2,4,6,8,10]

使用函数range()几乎能够创建任何需要的数字集,例如,创建一个列表,其中包含前十个整数的平方:
squares.py

squares[]
for value in range(1,11):
    squares.append(value**2)
print(squares)


[1,4,9,16,25,36,49,64,81,100]

3.对数字列表执行简单的统计计算(仅举了几个例子)

最大值:max()
最小值:min()
总和:sum()

4.列表解析

列表解析将for循环和创建新元素的代码合并成一行,并自动附加新元素。
下面示例使用列表解析创建你在前面看到的平方数列表:
squares.py

squares=[value**2 for value in range(1,11)]
print(squares)


[1,4,9,16,25,36,49,64,81,100]

注:要使用这种语法,首先指定一个描述性的列表名,如squares;然后,指定一个左方括号,并定义一个表达式,用于生成你要存储到列表中的值。在这个示例中,表达式为value**2;接下来编写一个for循环,用于给表达式提供值,再加上右方括号。请注意这里的for语句末尾没有冒号。

四、使用列表的一部分

上述第四章讲述的都是如何处理列表的所有元素,你还可以处理列表的部分元素——Python称之为切片。

1.切片

要创建切片,可指定要使用的第一个元素的索引和最后一个元素的索引加1。
players.py

players=['charles','martina','michael','florence','eli']
print(players[0:3])
print(players[1:4])

['charles','martina','michael']
['martina','michael','florence']

注:1.如果你没有指定第一个索引,Python将自动从列表开头开始;若没有指定最后一个索引,同理将一直到末尾。
2.Python支持负数索引的切片

2.遍历切片

如果要遍历列表的部分元素,可在for循环中使用切片。

players=['charles','martina','michael','florence','eli']

print("Here are the first three players on my team:")
for player in players[:3]:
    print(player.title())


Here are the first three players on my team:
Charles
Martina
Michael

上述代码没有遍历整个队员列表,而只遍历前三名队员。

3.复制列表

要复制列表,可创建一个包含整个列表的切片,方法时同时省略起始索引和终止索引([:])。例如:
foods.py

my_foods=['pizza','falafel','carrot cake']
friend_foods=my_foods[:]

my_foods.append('cannoli')
friend_foods.append('ice cream')

print("My fovorite foods are:")
print(my_foods)

print("\nMy friend's fovorite foods are:")
print(friend_foods)


My fovorite foods are:
['pizza','falafel','carrot cake','cannoli']

My friend's fovorite foods are:
['pizza','falafel','carrot cake','ice cream']

注:如果我们只是简单的将my_foods赋给friend_foods,就不能得到两个列表。例如:

my_foods=['pizza','falafel','carrot cake']

#这行不通
friend_foods=my_foods

my_foods.append('cannoli')
friend_foods.append('ice cream')

print("My fovorite foods are:")
print(my_foods)

print("\nMy friend's fovorite foods are:")
print(friend_foods)


My fovorite foods are:
['pizza','falafel','carrot cake','cannoli','ice cream']

My friend's fovorite foods are:
['pizza','falafel','carrot cake','cannoli','ice cream']

这种语法实际上是让Python将新变量friend_foods关联到包含在my_foods中的列表,因此这两个变量都指向同一个列表。所以,当我们将 ‘cannoli’添加到my_foods中时,它也将出现在friend_foods中;同样,虽然 ‘ice cream’好像只被加入到了friend_foods中,但它也将出现在两个列表中。(分清楚赋值和副本存储的区别!)

五、元组

列表非常适合用于存储在程序运行期间可能变化的数据集。列表是可以修改的,但是有时你需要船舰一系列不可修改的元素,元组可以满足这种需求。Python将不能修改的值称为不可变的,而不可变的列表被称为元组。

1.定义元组

元组看起来犹如列表,但使用圆括号而不是方括号来标识。定义元组后,就可以使用索引来访问其元素,就像访问列表元素一样。
dimensions.py

dimensions=(200,50)
print(dimensions[0])
print(dimensions[1])


200
50

如果修改元组中的一个元素,例如dimensions[0]=250,那么会导致Python返回类型错误消息。

2.遍历元组中的所有值

像列表一样,也可以使用for循环来遍历元组中的所有值。

3.修改元组变量

虽然不能修改元组的元素,但可以给存储元组的变量赋值。例如:

dimensions=(200,50)
print("Original dimensions:")
for dimension in dimensions:
    print(dimension)

dimensions=(400,100)
print("\nModified dimensions:")
for dimension in dimensions:
    print(dimension)


Original dimensions:
200
50

Modified dimensions:
400
100