推荐《Python 编程:从入门到实践》之Python编程的基础知识
在 Python 学习资源琳琅满目的当下,《Python 编程:从入门到实践》脱颖而出,堪称 Python 入门的不二之选。本书由经验丰富的教育工作者撰写,以清晰易懂的语言和循序渐进的方式,引领读者从 Python 的基础语法逐步迈向实际项目开发。
书中内容分为两大部分。第一部分细致阐述 Python 编程的基本概念,涵盖变量、数据类型、控制结构、函数、模块等核心知识,搭配丰富的示例代码与实操练习,让读者轻松理解并掌握。第二部分则聚焦于项目实践,通过开发简单游戏、数据可视化项目以及 Web 应用,帮助读者将所学理论应用于实际,切实提升编程能力,积累项目经验。
无论是毫无编程经验的小白,还是想系统学习 Python 的爱好者,本书都能满足需求。其丰富的配套资源,如源代码、练习题答案、视频教程等,更为自学提供便利。选择这本书,就是选择一条高效、扎实的 Python 学习之路,开启你的编程之旅吧!
Python基础知识罗列:
变量:
变量名只能包含字母、数字和下划线。
能以字母或下划线打头,不能以数字打头。
不能包含空格,但能通过下划线分隔其中的单词
不要将Python关键字和函数名用作变量名
不要使用Python保留用于特殊用途的单词,如print等
变量名应当简短又具有描述性
字符串:
字符串是一系列字符。在Python中,用引号括起来的都是字符串,引号可以是单引号也可以是双引号。
‘This is a string’ “This is also a string”
1、修改字符串中单词的大小写
.title() 以首字母大写的方式显示每个单词,即将每个单词的首字母都改成大写。
.lower() 将字符串中全部字符改成小写
2、字符串中使用变量
要在字符串中插入变量的值,可在引号前加上字母f,再将要插入的变量放在花括号内。
first_name = ‘ada’ last_name = ‘lovelace’
full_name = f"{first_name} {last_name}"
f是format(设置格式)的简写,Python可通过花括号内的变量替换为其值来设置字符串的格式。
3、删除空白
在程序中,额外的空白意义重大,同样的’python’,'python ',两个字符串看起来几乎没什么,
但是在python中它们就是不同的字符串。python可通过方法去除字符串开头
.rstrip() 剔除字符串右侧的空白
.lstrip() 剔除字符串左侧的空白
4、使用字符串时避免语法错误
message= “One of Python’s strengths is its diverse community.”
撇号位于两个双引号之间,因此Python可以正确解释这个字符串,如果换成单引号则会报错,因为无法确定字符串结束的位置
数:
1、整数和浮点数:Python可以对整数和浮点数进行加、减、乘、除和幂运算等数学算法。
在使用数时,无需专门考虑整数和浮点数,Python通常会按你期望的方式处理它们
将任意两个数相除,结果总是浮点数,即便这两个数都是整数且能整除
整数和浮点数做任何运算,结果也总是浮点数
2、书写很大的数时,可以使用下划线将其中的数字分组,方便阅读。 如:14_000_000_000
给多个变量赋值,可通过逗号将变量名和赋值进初始化
常量:
类似于变量,但其值在程序的整个生命周期内保持不变。
MAX_CONECTIOSN = 5000
注释:
1、行注释:在Python中,注释用井号(#)标识。井号后面的内容都会被Python解释器忽略。
2、文段注释:在Python中,被两个三引号(‘’')括起来的就是文段注释
列表
1、概念:有一系列按特定顺序排列的元素组成。可以包含字母、数字等。元素之间没有任何关系。
2、访问列表元素:
列表是有序集合,因此访问列表的任意元素,只需将该元素的位置(索引)告诉Python即可。
列表的索引是从0开始而不是1。Python访问列表最后一个元素,可通过索引-1查询
修改、添加和删除元素:
要修改元素,可指定列表名和要修改元素的索引,再指定该元素的新值。
append():给列表附加元素时,将新增元素添加到列表末尾。这个方法需要创建空列表,再将元素添加到空列表中。
insert(位置,新元素):可在列表的任何位置添加新的元素。
del语句:通过知道要删除的元素位置,通过del语句删除。如 del 列表[位置]
pop():删除列表末尾的元素,并可以将删除的元素赋值给变量,进行操作。
pop方法也可删除列表中任意位置的元素,只需在圆括号中指定要删除元素的索引即可。
sort():按字母顺序进行排序,永久性地修改列表元素的排列顺序。如需反向排序,只需传参数reverse=True即可。
sorted():保留列表原始排列顺序的同时以特定的顺序呈现新的排列顺序。此方法不会影响列表原有的排列顺序
reverse():此方法不是按字母顺序相反的顺序排列元素,只是单纯得反转列表现有的排列顺序
len():快速获悉列表的长度
range():循环遍历数字 range(1,5) 遍历从1到4,不包含5.
for循环遍历列表:一定要进行缩进,python是通过缩进来区分系统层级的,不可遗漏冒号
切片:要创建切片,可指定要使用的第一个元素和最后一个元素的索引。与函数range()一样,Python在到达第二个索引之前的元素后停止。
例如:player = [‘charles’,‘martina’,‘michael’,‘florence’,‘eil’] print(players[0:3])
起始索引和终止索引可以省略,省略后标识从第一个开始,最后一个结束
同时省略起始索引和终止索引([:]),相当于将复制整个列表作为副本
元组:
1、定义:元组看起来很像列表,但使用圆括号而非中括号来标识。定义元组后,就可使用索引来访问其元素,就像访问列表元素一样。
试图修改元组的操作是被禁止的,因此Python指出不能给元组的元素赋值。
严格地说,元组是由逗号标识地,圆括号只是让元组看起来更整洁、清晰。如果定义一个只包含一个元素的元组必须在这个元素后加逗号。
元组可以重新被赋值,不能进行直接修改。
相比于列表,元组是更简单的数据结构,如果需要存储一组值在程序的整个生命周期内都不变,就可以使用元组
if语句:
每条if语句的核心是一个值为True或False的表达式,这种表达式称为条件测试。Python根据条件测试的值为True还是False来决定是否
执行if语句中的代码.
Python检查是否相等时区分大小写。例如,两个大小写不同的值被视为不相等。
格式:if-else、if-elif-else
布尔表达式
布尔表达式是条件测试的别名,与条件表达式一样,布尔表达式的结果要么为True,要么为False。布尔值通常用于记录条件。
字典:
1、在Python中,字典是一系列的键值对,用{}花括号括起来的。每个键都与一个值相关联,你可使用键来访问相关联的值。与健相关联的值可以是数、字符串、
列表乃至字典。事实上,可将任何Python对象用作字典中的值。例如:alien_0 = {‘color’:‘green’,‘points’:5}
键值对是两个相关联的值。指定键时,Python将返回与之相关联的值。键和值之间用冒号分隔,而键值对之间用逗号分隔。
访问字典中的值:alien_0[‘color’] 将返回字典alien_0中与’color’相关联的值。
使用del语句删除键值对,必须指定字典名和要删除的键 如:del alien_0[‘points’]
使用get()来访问值,使用放在方括号内的键从字典中获取感兴趣的值。如果指定的键不存在就会报错。
2、遍历字典:
.items() 该方法返回一个键值对列表。每次循环都可获取一个键值对
.keys() 该方法获取字典中所有的键
通过对keys的记过进行stored()方法,就可按特定的顺序访问字典
.values() 该方法获取字典中所有的值
3、用户输入:
函数input()让程序暂停运行,等待用户输入一些文本。获取用户输入侯,Python将其赋给一个变量,以方便使用。
input函数可接受一个参数————要向用户显示的提示或说明,让用户知道该怎么做。
input函数获得的市一个字符串,如果程序要实现其他类型的数据可通过int()、float()等函数进行转换
4、while循环
格式:
while 判断条件:
程序体
如何终止while循环:
1、while的判断条件不成立,则不会运行while中的程序体。
2、break语句,break语句用于控制程序流程,可用来控制哪些代码执行,哪些代码不执行
继续执行循环(continue):continue语句会终止本次循环执行continue语句后的代码,返回循环开头,执行新一次的循环。
注意:while循环在任何时候都要有终止运行的途径,否则程序会一直没完没了的执行下去。
for循环和while循环一样,都是循环代码的一种方式,只不过一种是判断条件,一种是直接循环实体类。但是所涉及的暂停
和继续循环的方式相同。
remove()来删除列表特定的值,可通过循环遍历列表内容,if判断一致,remove删除内容。
此方法会有个问题,就是如果被删除的内容是列表、字典等最后一个内容,那么再次for循环,不会终止如果执行内容.方法会报null
避免此报错出现的方法可通过while循环判断列表是否是否为空。
函数:
1、定义函数:使用关键字def来告诉Python,要定义一个函数:
def 函数名(参数……):
2、函数体
函数调用:通过输入函数名与需要的参数来调用函数,参数便是用来
参数:分为实参、形参
定义函数时的变量成为形参,即函数完成工作所需的信息。
再调用函数时传递的参数为实参,在调用函数过程中将实参这个值赋值给了形参
传递实参的方式:位置实参、关键字实参
位置实参:调用函数时,Python必须将函数调用中的每个实参都关联到函数定义中的一个形参。
def describe_pet(animal_type,pet_name):print(f"\nI have a {animal_type}.")print(f"My {animal_type}'s name is {pet_name}")describe_pet("hamster","Harry")
这个实例表明,传递参数时,必须一一对应,函数才能显示正确的内容
位置实参的顺序很重要,位置不同得到的结果可能出乎意料。
关键字实参:是传递给函数的名称值对,因为直接在实参中将名称和值关联起来,所以向函数传递实参时不会混淆。
describe_pet(animal_type=‘hamster’,pet_name=‘harry’)
关键字实参的顺序无关精要。因为已经将名称和值关联起来,Python知道各个值赋值给哪个形参。
默认值:编写函数时,可给每个形参指定默认值。在调用函数中给形参提供实参时,Python将使用指定的实参值。因此,在给形参指定默认值后,
可在函数调用中省略相应的实参。
def describe_pet(animal_type=‘dog’,pet_name):
即便函数定义了默认值,再调用函数时依然可以传递其他实参,来忽略形参的默认值
返回值:函数并非总是直接显示输出,它可以处理一些数据,并返回一个或一组值。
实参变成可选的:可将形参默认为空,在调用时不传递该参数值即可。
函数可返回任何类型的值,包括列表和字典等较复杂的数据结构。
函数的一个重要属性:多次调用。多次调用函数是一种效率极高的工作方式。编写一次函数体代码,每次调用传入不同的参数,便得到不同的值。
导入整个模块:要让函数是可导入的,得先创建模块。模块是扩展名为.py的文件,包含要导入到程序中的代码。import 模块名
导入特定的函数:from module_name import function_name……
通过逗号分割函数名,可导入任意数量的函数
如果导入的函数名称可能与程序中现有的名称冲突,或函数名称太长,可通过as 指定一个别名
例如:from pizza import make_pizza as mp
导入模块中的所有函数:使用星号(*)运算符可以让Python导入模块中的所有函数
类:
1、类的基本格式,例如创建一个Dog类
class Dog():"""一次模拟小狗的简单尝试"""def __init__(self,name,age):"""初始化属性name和age"""self.name = nameself.age = agedef sit(self):"""模拟小狗命令时蹲下"""print(self.name.title() + " is now setting.")def roll_over(self):"""模拟小狗被命令时打滚"""print(self.name.title() + " is now setting.")
类中的函数成为方法:有关函数的一切都适用于方法。唯一重要的差别就是调用方法的方式.
init()是一个特殊的方法,每当创建一个类的实例时,Python都会自动运行它。方法中self参数是必不可少的,因为python创建类的实例时
将自动传入实参self。每个与类关联的方式调用都自动传递实参self,它是一个指向实例本身的引用,让实例能够访问类中的属性和方法。
定义变量前缀self。以self为前缀的变量都可以供类中的所有芳芳使用,还可以通过类的任何实例来访问这些变量。self.name = name获取存储在
形参name中的值,并将存储到变量name中,然后该变量被关联到当前创建的实例。
2、根据类创建实例
my_dog = Dog(‘willie’,6)
访问属性:要访问实例的属性,可使用句点表示法。 my_dog.name
调用方法:根据Dog类创建实例后,就可以使用句点表示法来调用Dog类中定义的任何方法。 my_dog.sit()
创建多个实例:可按需求根据类创建任意数量的实例
my_dog = Dog(‘willie’,6)
your_dog = Dog(‘lucy’,3)
在每个实例中,都有自己的一组属性,能够执行相同的操作。
实际中,可以使用类来模拟现实世界中的很多情景。类编写好后,根据类创建实例。你需要执行的一个重要任务是修改实例的属性。可以直接修改实例的属性
也可以编写方法以特定的方式进行修改。
例如:class Car():"""一次模拟汽车的简单尝试"""def __init__(self,make,model,year):"""初始话描述汽车的属性"""self.make = makeself.model = modelself.year = yeardef get_descriptive_name(self):"""返回整洁的描述性信息"""long_name = str(self.year)+' '+self.make+' '+self.modelreturn long_name.title()my_new_car = Car('audi','a4',2016)print(my_new_car.get_descriptive_name())
给属性指定默认值:类中的每个属性都必须有初始值,哪怕这个值是0或空字符串。如设置默认值时,在方法__init__()内指定这种初始值是可行的,无需包含
为它提供初始值的形参。
在上面Car中__init__()新增odometer_reading的属性,其初始值总是为0。self.odometer_reading=0,并新增read_odometer()方法读取汽车里程表。
3、修改属性的值
1)直接修改属性的值:最简单的方式是通过实例直接访问它。
my_new_car.odometer_reading = 23
my_new_car.read_odometer()
通过方法修改属性的值:通过更新属性的方法,可无需直接访问属性,而可将值传递给一个方法,有它在内部进行更新。
新增update_odometer(self,mileage)方法更新汽车里程表
my_new_car.update_odometer(23)
my_new_car.read_odometer()
通过方法对属性的值进行递增:有时候需要将属性值递增特定的量,不知设置全新的值。可通过方法传递增量,并相应增加属性值
新增方法increment_odometer(self,mileage),实时变更汽车里程表
my_new_car.increment_odometer(100)
my_new_car.read_odometer()
4、继承:编写类时,并非总是从空白开始。如果要编写的类是另一个现成类的特殊版本,可使用继承。一个类继承另一个类,它将自动获得另一个类的所有属性和方法
原有的类称为父类,而新类成为子类。子类继承了其父类的所有属性和方法,同时还可以定义自己的属性和方法。
创建子类的实例时,Python首先需要完成的任务是给父类的所有属性赋值。因此子类的方法__init__()需要父类施以援手。
例如创建子类ElectricCar继承父类Carclass ElectricCar(Car):"""电动汽车的独特之处"""def __init__(self,make,model,year):"""初始化父类的属性"""super().__init__(make,model,year)my_tesla = ElectricCar('tesla','model s',2016)print(my_tesla.get_descriptive_name())
给子类定义属性和方法:让一个类继承另一个类后,可添加区分子类和父类所需的新属性和方法self.battery_size = 70def describe_battery(self):"""打印一条描述电瓶容量的消息"""print("This car has a "+str(self.battery_size)+"-kWh battery.")
根据ElectricCar类创建的所有实例都包含这个属性,但是所有Car实例都不包含它。
重写父类的方法:对于父类的方法,只要不符合子类模拟的实物的行为,都可对其进行重写。为此,可在子类中定义一个这样的方法,即它与要重写的父类方法同名。这样Python将不会考虑这个父类方法,而只关注你在子类中定义的相应方法。def fill_gas_tank():"""电动汽车没有油箱"""print("This car doesn't need a gas tank!")如果对电动汽车调用fill_gas_tank(),Python将忽略Car类中的方法fill_gas_tank().转而运行子类方法。使用继承时,可让子类保留从父类那里继承的精华,并剔除不需要的糟粕。将实例用作属性:使用代码模拟实物时,会发现给类添加的细节越来越多。属性和方法清单以及文件越来越长,这种情况下,可需要将类的一部分作为一个独立的类提出来。例如ElectricCar类中,涉及电瓶的属性和方法越来越多,我们可以将这部分提出来放到一个Battery的类中。
文件和异常
1、从文件中读取数据
读取整个文件:with open('pi_digits.txt') as file_object:contents = file_object.read()print(contents)关键字with在不再需要访问文件后将其关闭,通过with可让Python去确定,你只管打开文件,并在需要时使用它,Python自会在合适的时候自动将其关闭。逐行读取文件,可通过for循环依次读取文件的每一行数据with open(filename) as file_object:for line in file_object:print(line)使用with关键字时,open()返回的文件对象只在with代码块中可用。
2、写入文件:
写入空文件:要将文本写入文件,在调用open()时需要提供另外一个实参,告诉Python你要写入打开的文件。filename = 'programming.txt'with open(filename,'w') as file_object:file_object.write("I Love programming.")第二个参数:w:写入模式打开文件r:读取模式打开文件a:附加模式打开文件r+:读取和写入模式打开文件Python只能将字符串写入文本文件。要将数值数据存储到文本文件中,必须用函数str()进行格式转换。
如果要给文件添加内容,而不是覆盖原有的内容,可以附加模式打开文件。这种模式不会在返回文件对象前清空文件。而是在文件末尾添加写入的内容。
3、异常:Python使用被称为异常的特殊对象来管理程序执行期间发生的错误。每当发生让Python不知所措的错误时,它都会创建一个异常对象,如果编写了处理该异常的代码
程序将继续运行;如果未对异常进行处理,程序将停止,并显示一个traceback,其中包含有关异常的报告。
使用try-except代码块处理异常,我们将导致错误的代码放到try代码块中。如果try代码块运行没问题,Python将跳过except代码块。反之将运行except代码块。
try-except-else代码块的工作原理:Python尝试执行try代码块中的代码;只有可能引发异常的代码才需要放在try语句中。有时候,有一些仅在try代码块执行成功时
才需要运行的代码;这些代码放在else代码块中。except代码块告诉Python,如果try代码块运引发了指定的异常,该怎么办。
json.dump():接受两个参数,要存储的数据和可用于存储数据的文件对象import jsonnums = [2,3,5,7,9]filename = 'nums.json'with open(filename,'w') as file_object:json.dump(nums,file_object)
json.load()加载存储在nums.json中的信息,并将其存储到变量nums中import jsonfilename = 'nums.json'with open(filename) as file_object:nums = json.load(file_object)
测试代码:
单元测试和测试用例:Python标准库中的模块unittest提供了代码测试工具。单元测试用于核实函数的某个方面没有问题;测试用例是一组单元测试。