一起啃书系列——Python编程从入门到实践1——基础知识阶段

欢迎来到和Alex一起啃书系列——Python编程从入门到实践1——基础知识阶段

  • 前言
    • 第1章.起步
      • 1.1搭建编程环境
      • 1.2Pycharm简单使用介绍
      • 1.3Pycharm进阶学习(刚开始学习可以不看)
      • 1.4课后习题
      • 1.5小结
    • 第2章.变量和简单数据类型
      • 2.1打印
      • 2.2变量
      • 2.3字符串
      • 2.4字符串训练
      • 2.4数字
      • 2.5注释
      • 2.6 Python之禅
    • 第3章.列表简介
      • 3.1列表是什么?
      • 3.2修改、添加和删除元素
      • 3.3组织列表
      • 3.4使用列表时避免索引错误
    • 第4章.操作列表
      • 4.1遍历整个列表
      • 4.2避免缩进错误
      • 4.3创建数值列表
      • 4.3.0课后习题练习
      • 4.4使用列表的一部分
      • 4.4.0课后习题练习
      • 4.5 元组
      • 4.6 设置代码格式
      • 4.7小结
    • 第5章.If语句
      • 5.1一个简单示例
      • 5.2条件测试
      • 5.3if语句
      • 5.4使用if语句处理列表
      • 5.5设置if语句的格式
      • 5.6小结
    • 第6章.字典
      • 6.1一个简单的字典
      • 6.2使用字典
      • 6.3遍历字典
      • 6.4嵌套
    • 第7章.用户输入和while循环
      • 7.1函数input())的工作原理
      • 7.2while循环简介
      • 7.3使用while循环来处理列表和字典
    • 第8章.函数
      • 8.1定义函数
      • 8.2传递实参
      • 8.3返回值
      • 8.4传递列表
      • 8.5传递任意数量的参数
      • 8.6将函数存储在模块中
      • 8.7函数编写指南
      • 8.8小结
    • 第9章.类
      • 9.1创建和使用类
      • 9.2使用类和实例
      • 9.3继承
      • 9.4导入类
      • 9.5Python标准库
      • 9.6类的编码风格
    • 第10章.文件和异常
      • 10.1从文件中读取数据
      • 10.2写文件
      • 10.3异常
      • 10.4存储数据
    • 第11章.测试代码
      • 11.1测试函数
      • 11.2测试类
    • 第12章.基础总结

前言

你好! 这是我第一次使用 CSDN这个博客平台进行撰写相关笔记,主要用于个人复习使用。之前也学习过很多语言,但是都是学完就忘,即将要进入到研究生学习阶段,我打算开始复习一下之前所学习过的知识,以便于以后更好的进入到CV/NLP的学习中去,如果你也恰好在学习相关知识,可以阅读这篇文章,了解一下Python编程的知识,如有不到位之处,请多包涵。

友情提示,本文档更像是一个阅读笔记,一定要配合书籍一同阅读。

学习前需知:
1.本次学习预备工具选择
书籍选择:Python编程从入门到实践;
Python版本:Python3.7(不强制要求,3.0及以上即可)
开发工具:Python自带的IDLE和PyCharm
一起啃书系列——Python编程从入门到实践1——基础知识阶段_第1张图片
2.学习安排
(1)由于之前已经有相关语言学习经验,所以本次学习比较快,如果你也有Python学习基础的话,那本次课程的学习将会如鱼得水。
(2)基础阶段:2天完成,本次学习主要围绕Python的基础语法进行学习,学习过程中会将书本上所未提及到的,以及Python2和Python3有差别的内容进行补充学习。
(3)2D游戏开发阶段:2天完成,本次学习主要围绕书本中的项目进行开发,相关遇到的问题解答和有关代码将会进行公示。
(4)数据可视化阶段:2天完成,,本次学习同样围绕书本中的项目进行开发,同时会引入一些其他案例进行学习。
(5)Web应用程序阶段:2天完成,本次学习主要围绕书本中的项目进行开发,相关遇到的问题解答和有关代码将会进行公示。

第1章.起步

1.1搭建编程环境

任何编程过程中最让人头疼的就是环境的配置,不过别担心,过段时间我将会为大家提供一个相关的Python环境安装和PyCharm安装的教程。

1.2Pycharm简单使用介绍

本部分借鉴“信号挖掘机”同学的文章。
1.新建Python工程,选择File–》New project。打开界面是这样的:
一起啃书系列——Python编程从入门到实践1——基础知识阶段_第2张图片
2.我们开始创建第一个项目,界面如下
一起啃书系列——Python编程从入门到实践1——基础知识阶段_第3张图片
左侧导航栏选择 Pure Python ,右侧的 Location 选择项目的路径,Base Interpreter 通过下拉栏选择 Python版本 ,这里直接使用 Python 的安装路径即可。

选择完成之后,点击 Create 按钮,进入界面。
3.这时就可以创建文件了,步骤如下图所示:
一起啃书系列——Python编程从入门到实践1——基础知识阶段_第4张图片
4.这里我们以刚刚创建的 PythonStudyFile 文件夹为例,依次点击
PythonStudyFile → New → Python File
一起啃书系列——Python编程从入门到实践1——基础知识阶段_第5张图片
5.测试Pycharm
一起啃书系列——Python编程从入门到实践1——基础知识阶段_第6张图片
6.恭喜,Pycharm最基本的使用功能已经学会了。

1.3Pycharm进阶学习(刚开始学习可以不看)

1.使用虚拟环境venv
一起啃书系列——Python编程从入门到实践1——基础知识阶段_第7张图片
一起啃书系列——Python编程从入门到实践1——基础知识阶段_第8张图片
Scripts部分将Python环境解释器复制过来
2.Python文件编写

#!/usr/bin/env python3
# -*- coding: utf-8 -*-

在项目开发过程中常常看到这样一段代码,其中第一句为本文件执行寻找解释器,使用过Linux系统的朋友可能会知道,项目开发中需要使用一个解释器,Python程序运行代码为:Python main.py ,如果不加Python命令,则会执行第一行的声明
第二行代码,指本文件需要使用UTF-8进行编码和解码

3.Pycharm下方
Run Console控制台输出项目中一些信息;
Terminal终端,类似于在项目所在文件夹位置的命令行执行CMD命令,区别在于,Terminal是使用项目选择的Python解释器,而CMD使用的电脑默认的解释器。

4.命令行编程方式

python demo.py hello world
--> print(sys.argv)
--> ['demo.py','hello','world']

如果要在项目每次运行中都带有这些参数可以在edit configeration中parameter选择并添加:
一起啃书系列——Python编程从入门到实践1——基础知识阶段_第9张图片

1.4课后习题

1.书本上第一章的第一个作业就是去浏览Python官网,以前学习语言的时候从来没有注意到去看官网,这次发现官网上有许多未来可能用得到的东西,例如:如何快速使用Python,Python的相关开发文档,Python社区,Python工作推荐,Python相关的新闻和发生的事件,以及其他成果人士的故事等等。
现阶段可能官网的使用不多,但是未来随着能力的增强,官网会成为我们学习Python的圣经Bible。
https://www.python.org/
2.1-2输入错误
随意输入错误
name ‘make_a_mistake’ is not defined,这个变量未被定义
一起啃书系列——Python编程从入门到实践1——基础知识阶段_第10张图片
E:\pycharm-workspaces\PythonBaseLearning\venv\Scripts\python.exe E:/pycharm-workspaces/PythonBaseLearning/1.Start/1.2Make_a_Mistake.py
File “E:/pycharm-workspaces/PythonBaseLearning/1.Start/1.2Make_a_Mistake.py”, line 12
make a mistake
^
SyntaxError: invalid syntax
反馈:语法错误
一起啃书系列——Python编程从入门到实践1——基础知识阶段_第11张图片
平常在写代码的过程中要注意错误反馈,修改错误是一种提升,如果以后在项目开发中出现没有反馈的报错是最头疼的。
3.1-3无穷的技艺,自己设想以后想要实现的功能和程序。

1.5小结

本章主要是记录一下本次学习Pycharm和Python相关知识的笔记,Pycharm是一个优秀的编程工具,如果你是一个新手小白,我不太建议你直接使用Pycharm,最好先从Python自带的IDLE开始,可以更好的了解Python的运行和进行语法检查,当然不使用它也没有太大的问题,毕竟我也是直接跳过它。

第2章.变量和简单数据类型

2.1打印

Print(“ hello world ”)
注意引号问题,print函数可以单引号也可双引号,如果函数内部还有引号则外部要双引号。

2.2变量

message = "Hello python world"
print(message)

1.变量的命名和使用
(1)变量名只能包含字母、数字和下划线,但是不能以数字开头
(2)变量名一般使用下划线来分隔单词
(3)不可以使用Python关键字作为变量名
(4)变量名应该既简短又具有描述性。
(5)谨慎使用小写字母l和大写字母O,易被认错。
(6)尽量使用小写的Python变量名
2.使用变量时避免命名错误

2.3字符串

Python中用引号括起来的都是字符串,其中引号可以为单引号或双引号,这种灵活性可以让我们的字符串中包含引号和撇号。
1.使用方法修改字符串的大小写

name = "pay attention to"
print(name.title())
-->Pay Attention To

字符串标题化:将字符串中每个单词第一个字母大写
upper();lower();也类似,可以亲自动手进行。
2.合并(拼接)字符串
使用+加号来合并字符串然后赋值给其他变量,这种方法也被称为拼接。
3.使用制表符或换行符来添加空白
(1)\t:缩进
(2)\n:换行
4.删除空白
(1)rstrip():删除字符串末尾空白
(2)lstrip():删除字符串开头空白
(3)strip():删除字符串两端的空白
5.Print()函数
在python2中括号可用可不用

print "hello world"

在python3中一定要使用括号

2.4字符串训练

2-3个性化消息

name = "Alex"
print('Hello ' + name + ',would you like to learn some Python today?')

2-4调整名字的大小写

name = "alex"

# 名字小写
print(name.lower())

# 名字大写
print(name.upper())

# 名字首字母大写
print(name.title())

剩下的题目读者自行完成

2.4数字

1.整数
对整数可以使用加+减-乘*除/进行基本的运算;
其中使用两个乘号 ()表示乘方(//)表示除方
3
2 = 8
2.浮点数
3.使用函数str()避免类型错误
直接使用age=23,则age是数值,str()可以改为字符串

2.5注释

1.如何编写注释
在Python中注释使用(#)标识

2.6 Python之禅

一些简单的编程方法论

import this
--》The Zen of Python, by Tim Peters
--》Beautiful is better than ugly.
--》Explicit is better than implicit.
--》Simple is better than complex.
--》Complex is better than complicated.

第3章.列表简介

3.1列表是什么?

列表是由一系列按照特定顺序排列的元素组成的,其中可以为字母、数字、字符串等等,使用方括号([ ])来表示列表,并用逗号来分隔其中的元素。
1.访问列表元素

num = ['1','2','3']
print(num[1])

2.索引从0而不是从1开始
所以num[1] 为2
Python为访问最后一个列表元素提供了一个特殊的语法,只要将索引指定为-1,即可让Python放回最后一个列表元素。
num[-1] 为3
同样也可以适用于其他负数索引值,-2返回倒数第二个列表元素。

3.使用列表中的各个值
num[1].title()````

3.2修改、添加和删除元素

1.修改列表元素
直接通过列表名和列表索引对指定元素进行修改
num[2] = ‘4’
2.添加列表元素
(1)在列表尾部添加元素:append(paramer)
num.append(‘5’)
(2)在列表中插入元素:insert(index,elem)将elem元素插入到index位置上
num.insert(0,‘6’)
3.从列表中删除元素
(1)使用del语句删除元素
num = [‘1’,‘2’,‘3’]
del num[0]
del语句可以删除任何位置上的列表元素,条件是知道其的索引;
使用del语句将该值从列表中删除后,将无法再次访问该元素了。
(2)使用方法pop()删除元素
pop类似于栈的弹出,可以删除列表的末尾元素,并且可以接着使用它
last_num = num.pop()
(3)弹出列表中任何位置处的元素
first_num = num.pop(0)
只需要在括号中指定要删除的元素的索引即可。
每使用pop()后,被弹出的元素就不再列表中了,如果不确定使用使用del语句还是pop方法,一个简单的判断条件,看之后是否会继续继续该元素。
(4)根据值删除元素
如果不知道要删除的元素所在的位置,只知道要删除元素的值,则可以使用方法remove()
num.remove(‘5’)
remove()方法只删除了第一个指定的值,如果要删除的元素出现多次,则要使用第7章的循环来判断。

3.3组织列表

创建的列表常常是无序的状态,我们无法对其进行相关的预测判断,而大多数情况下我们要按照某种特定的顺序进行呈现,Python提供了很多组织列表的方法,可以根据具体的情况进行选用。
1.sort()方法对列表进行永久性排序
(1)无参的sort方法为按字母顺序进行排序
(2)传递参数reverse=True则将列表按照字母顺序按照相反的顺序进行排序
2.sorted()函数对列表进行临时排序
同样可以传递参数reverse=True
3.倒着打印列表
reverse()方法永久性地改变列表元素的排列顺序,它仅仅是反转了列表元素的排列顺序。
4.确定列表的长度
使用len()函数可以快速获取列表的长度

3.4使用列表时避免索引错误

我们常常想通过正向的索引进行查找元素,但是常常会出现最后一个元素无法访问而报错,所以访问后面的元素最好使用负数进行访问。

第4章.操作列表

4.1遍历整个列表

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

1.深入研究循环
for magincian in magicians 这个语句对列表中的每个元素都执行指定的步骤,首先将列表magicians中的第一个值alice存储到magician这个变量中去,然后执行循环中的指定步骤,使用循环时,每个元素都将会执行一遍。在for循环过程中,用于存储列表中的每个值的临时变量可以指定任何名称,但是一般都是选择与之对应的有意义的名称。
2.在for循环中执行更多的操作

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

4.2避免缩进错误

Python通过使用缩进让代码更加容易读,且结构更加整洁清晰
通常存在以下几种情况的缩进问题
(1)忘记缩进(编译错误)
(2)忘记缩进额外的代码行(逻辑错误)
(3)不必要的缩进
(4)循环后不必要的缩进
(5)遗漏了冒号

4.3创建数值列表

(1)使用函数range()

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

只会输出1,2,3,4
从第一个数字开始到第二个数字前一个停止。
(2)使用range()创建数字列表
想要创建数字列表可以直接使用函数list()将range()的结果直接转化为列表。

numbers = list(range(1,5))

range()函数还可以指定步长
range(start,end,step)
(3)对数字列表执行简单的统计计算
在Python中有几个专门用于处理数字列表的Python函数,例如min()、max()、max()
(4)列表解析
列表解析将for循环和创建新元素的代码合并成一行,并自动附加新元素。
【1】非列表解析方式

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

print(squares)

【2】列表解析方式

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

4.3.0课后习题练习

之前没有去练习课后习题,一方面是觉得太过于简单,另一方面是它题目太奇怪。
4-3数列20:

for num in range(1, 21):
    print(num)

4-4一百万

num_list = list(range(1, 1000000))

for num in num_list:
    print(num)

4-5计算1~1000000的总和

num_list = list(range(1, 1000000))

print(min(num_list))
print(max(num_list))
print(sum(num_list))

4-6奇数

odd_num_list = list(range(1, 20, 2))

for odd_num in odd_num_list:
    print(odd_num, end=" ")

4-7 3的倍数

multiple_3_num_list = list(range(3, 30, 3))

for num in multiple_3_num_list:
    print(num, end=" ")

4-8 立方

num_list = list(range(1, 10))

cube_num_list = [num**3 for num in num_list]

for num in cube_num_list:
    print(num, end=" ")

4-9立方解析

cube_num_list = [num**3 for num in list(range(1, 10))]
for num in cube_num_list:
    print(num, end=" ")

4.4使用列表的一部分

处理列表的部分元素——Python称之为切片
1.切片
num = [‘1’, ‘2’, ‘3’ ,‘4’, ‘5’, ‘6’]
创建切片,可以指定需要使用的第一个元素的索引和最后一个元素的索引加一
(1)list[start:end]
start为切片的开头,end为结尾,切片长度为end-start
(2)缺省一个参数的切片
缺少start为列表开头到end,缺少end为start到列表结尾
(3)同样也可以使用负数作为索引

2.遍历切片
3.复制列表
这个时候就有一个关键的问题(硬拷贝和软拷贝问题)
如果不使用切片进行复制,则为软拷贝
friend_food = my_food
如果使用切片进行复制,则为硬拷贝
friend_food = my_food[ : ]
其中两个索引位置可以由我们自行定义,缺少则为全部元素

4.4.0课后习题练习

4-10切片

cube_num_list = [num**3 for num in list(range(1, 15))]
for num in cube_num_list:
    print(num, end=" ")

print("\nThe first three items in the list are:", end="")
print(cube_num_list[:3])

print("\nThree items from the middle of the list are:", end="")
print(cube_num_list[int(len(cube_num_list)/2)-1:int(len(cube_num_list)/2)+2])

print("\nThe last three items in the list are:", end="")
print(cube_num_list[-3:])

4.5 元组

列表一般用于存储运行期间可能发生变化的数据集,所以列表是可以修改的。当然有时候我们还需要创建一些不可以修改的元素,而元组恰好可以满足这个需求,不可变的列表被称为元组。
1.定义元组
列表是用方括号进行标识,而元组是使用圆括号进行标识
dimension = (200, 50)
2.遍历元组中的所有值
和列表中的一样
3.修改元组变量
元组不可以修改其内部的元素,但是可以对元组进行重新赋值定义。

4.6 设置代码格式

Python程序员都准许一些基本的代码格式约定,以便于明白他人编写的Python代码的整体结构。
1.格式设置指南
PEP8格式指南,有空再去阅读
2.缩进
PEP8建议每个缩进都是用4个空格
3.行长
一般程序员都建议一行不超过80个字符
4.空行
用空行将程序的不同部分进行分隔
5.其他格式设置指南

4.7小结

本章主要学习了for语句,列表和元组这两种数据结构,并且学习如何对它们进行操作

第5章.If语句

5.1一个简单示例

cars = ['audi', 'bmw', 'subaru', 'toyota']

for car in cars:
	if car == 'bmw':
		print(car.upper())
	else:
		print(car.title())

5.2条件测试

1.检查是否相等
使用两个等号(==)称为相等运算符,如果判断结果相等返回True,否则返回False。
2.检查是否相等时考虑大小写

car = 'bmw'
car == 'BMW'
==> False

一般在系统中判断会先转为upper()或者lower()再进行判断
3.检查是否不相等
判断两个值是否不相等可以使用(!=)
4.比较数字
5.检查多个条件
(1)使用and检查多个条件(需要同时满足条件)
(2)使用or检查多个条件(只要满足其中的一个条件即可)
6.检查特定值是否包含在列表中
判断某个元素是否包含在指定列表中,可以使用关键字in

num = [1, 2, 3, 4, 5]
2 in num
==>True

7.检查指定值是否不包含在列表中
可以使用not in关键字
8.布尔表达式
布尔表达式为条件测试的别名

5.3if语句

1.简单if语句

if condition_test:
	do something 

在if语句中缩进和for语句一样,如果条件通过,则执行if语句后面的所有缩进代码块
2.if-else语句

if condition_test:
	do something 
else:
	do other things

3.if-elif-else语句
4.使用多个elif代码块
5.省略else代码块
如果省略了else代码块,则其中使用了一个elif代替了else代码块
6.测试多个条件

如果只想执行一个代码块,则使用if-elif-else结构;如果要运行多个代码块,就要使用一系列独立的if语句

5.4使用if语句处理列表

1.检查特殊元素
2.确定列表是否为空

nums = []
if nums:
	for num in nums:
		do something
else:
	do other things

3.使用多个列表

5.5设置if语句的格式

5.6小结

本节学习了条件测试、if语句

第6章.字典

6.1一个简单的字典

dict = {‘a’: 1, ‘b’: 2, ‘b’: ‘3’}
dict[‘b’]
‘3’

dict
{‘a’: 1, ‘b’: ‘3’}

6.2使用字典

在Python中,字典是一系列键值对,用花括号进行表示,指定键时,Python将会返回与之对应的值,键和值之间是用冒号分割开来,而键值对之间使用逗号分隔开来,与键对应的值可以是数字、字符串、列表和字典等
1.访问字典中的值
2.添加键值对
要添加键值对可以依次指定字典名、用方括号括起来的键和相关联的值。
注意:键值对的排列顺序和添加顺序不同,Python不关心键值对的添加顺序,只关心键和值之间的关联关系。
3.创建一个字典
dict = {}
4.修改字典中的值
dict[‘a’] = 10
5.删除键值对
使用del语句
del dict[‘a’]
这种删除为永久删除
6.由类似对象组成的字典

6.3遍历字典

1.遍历所有的键值对
for key, value in dict.iterms():
该条for语句的第二部分包含字典名和方法items(),该方法返回一个键值对列表,接下来for循环依次将每个键值对存储到对应的两个变量中
遍历字典时,返回的顺序和存储的顺序无关,它仅仅关注键和值之间的关系。
2.遍历字典中的所有键
方法keys()可以返回字典中的所有键的一个列表
当然,如果不显式的表明keys(),也是默认遍历所有的键
for key in dict.keys() = for key in dict
3.按顺序遍历字典中的所有键
for key in sorted(dict.keys())
4.遍历字典中所有的值
方法values()返回一个值的列表
5.集合set
set类似于列表,但是它每个元素都必须是独一无二的
for value in set(dict.values())

6.4嵌套

有时候需要将字典存储到列表中,或者列表存储到字典中等,这种行为称为嵌套。
1.字典列表
2.在字典中存储列表
3.在字典中存储字典

第7章.用户输入和while循环

7.1函数input())的工作原理

input()让程序暂停运行,等待用户输入文本,获取用户的输入后存入一个变量中。

message = input('Enter a number')

input()接受一个参数:即要向用户显示的提示或说明,让用户知道该如何去做。
1.编写清晰的程序
也可以将提示存入一个字符串中,然后将字符串变量作为参数传递给input()函数。
2.使用int()来获取数值型输入

message = input('Enter a number')
num = int(message)

3.求模运算符(%)
将两个数相除并返回余数
4.Python版本区别
Python2.7中应该使用raw_input()替代Python3中的input()

7.2while循环简介

for循环用于针对集合中的每个元素的一个代码块,而while循环是不断运行,直到指定条件不满足为止。
1.使用while循环
while num < 5:
do something
2.让用户选择何时推出
while num != 5
do something
3.使用标志

while flag:

if num == 5:
	flag = False
else:
	flag = True

4.使用break退出循环

while Trueif num == 5:
		break

5.在循环中使用continue
continue只跳出本次的循环
6.避免无限循环

7.3使用while循环来处理列表和字典

1.在列表之间移动元素
2.删除包含特定值的所有列表元素
3.使用用户输入来填充字典

第8章.函数

8.1定义函数

def greet_user():
	```显示简单的问候语```
	print('Hello!')

greet_user()

1.向函数传递信息
2.实参和形参

8.2传递实参

向函数传递实参的方式比较多,可以使用位置实参(要求实参的顺序与形参的顺序相同),也可以使用关键字实参(其中每个实参都是由变量名和值组成),还可以使用列表和字典等方法
1.位置实参
describe_pet(‘harry’, ‘hamster’)
位置实参将函数调用中的每个实参都关联到一个形参上,这种最简单的关联方式是基于实参的顺序。
(1)调用函数多次
(2)位置实参的顺序很重要
2.关键字实参
describe_pet(animal_type=‘hamster’, pet_name=‘harray’)
3.默认值
编写函数时可以给每个形参指定一个默认值

def describe_pet(pet_name, animal_type='dog'):
	do something

4.等效的函数调用
可以混合使用位置实参、关键字实参和默认值,但是参数在书写时要遵循一定的顺序,即:位置参数、默认参数、变长参数、关键字参数、命名关键字参数
5.避免实参错误

8.3返回值

在函数中可以使用return语句将值返回到调用函数的代码行
1.返回简单值
2.让实参变成可选的
3.返回字典
4.结合使用函数和while循环

8.4传递列表

1.在函数中修改列表
将列表传递给函数后,函数对其进行修改后,这个修改将是永久的。
2.禁止函数修改列表
可以使用切片向函数传递列表的副本
function_name(list[ : ])

8.5传递任意数量的参数

有时候我们需要接受任意数量的实参,但是预先不知道传递给函数的会是什么样的信息,于是可以将函数编写成可以接受任意数量的键值对。

def build_profile(frist_name, last_name, **user_info)
	do something

user_profile = build_profile('Zeng', 'Alexander', sex = 'man', age = 21)

形参中的user_info中的两个星号让Python创建一个,名为user_info的空字典,并将收到的键值对都封装到这个字典之中。
当形参如*arg时表示传入数组,当形参如
args时表示传入字典。

8.6将函数存储在模块中

将函数存储在被称为模块的独立文件中,再将模块导入到主程序中。import语句运行在当前运行的程序文件中使用模块中的代码。
1.导入整个模块
要让函数是可以导入的,首先需要先创建模块。所谓模块就是扩展名为.py的文件,包含要导入到程序中的代码。
pizza.py

def make_pizza(size, *toppings):
	do something

making_pizzas.py

import pizza

pizza.make_pizza(16, 'pepperoni')
pizza.make_pizza(12, 'mushrooms', 'green peppers', 'extra cheese')

2.导入特定的函数
从模块中导入任意数量的函数

from module_name import function_name

from module_name import function_0, function_1, function_2

3.使用as给函数指定别名
如果要导入的函数的名称与现有的名称冲突,或者函数名称太长了,可以指定一个简短的别名,类似外号。

from pizza import make_pizza as mp

4.使用as给模块指定别名

import pizza as p

5.导入模块中的所有函数
使用(*)运算符可以让Python导入模块中的所有函数:

from pizza import *

在大型项目中最好不要这样导入,如果模块中存在与自己项目使用名称相同可能会导致意想不到的后果。

8.7函数编写指南

1.函数名只使用小写字母和下划线。
2.给形参指定默认值时,等号两边不要有空格。
3.函数调用过程中的关键字实参,等号两边也不要有空格
4.所有的import语句都应该放在文件的开头

8.8小结

在本章,学习了如何编写函数、如何传递参数、如何将函数存入模块中

第9章.类

9.1创建和使用类

1.一个基本的类
dog.py

class Dog():
	```一次模拟小狗的简单尝试```
	
	def __init__(self, name, age):
		```初始化属性name和age```
		self.name = name
		self.age = age

	def sit(self):
		do something

	def roll_over(self):
		do something
	

【1】方法__init__()
类中函数称为方法,在方法中,开头和末尾各有两个下划线,这是一种约定,旨在避免Python的默认方法与类中的普通方法名称发生冲突。
在创建该类的实例时,Python将自动调用该类的__init__()方法来自动创建,在通过实参向类传递属性值时,self是会自动传递,因此我们不需要传递它。
【2】Python2与Python3的区别
在Python2.7中创建类需要在类后的括号里包含单词object。
【3】根据类创建实例

object = Class(param1,param2)

【4】访问属性
object.name
【5】调用方法
object.function()
【6】创建多个实例
只要不同实例的名称不同即可

9.2使用类和实例

【1】给属性指定默认值
在__init()__方法中赋予对应的属性默认的值
【2】修改属性的值
1.直接修改属性值
2.通过方法修改属性值

9.3继承

【1】子类的方法__init__()
1.创建子类,父类必须先包含在当前文件中,且位于子类前面,并且在定义子类时,必须在括号内指定父类的名称。
super()是一个特殊函数,帮助Python将父类和子类关联起来。父类也称为超类,名称super因此而得名。

class Subclass(SuperClass):
	
	def __init__(self,make,model,year):
		super().__init__(make,model,year)	

【2】Python2.7中的继承
子类的__init__()方法调用父类super()方法需要传递两个实参(子类名,和对象self)
【3】给子类定义属性和方法
让一个类继承另一个类,可以添加区分子类和父类的新属性和方法。
【4】重新父类的方法
对于继承父类的子类,如果父类有不符合子类的方法,可以对其进行重写,只要在子类中定义一个这样的方法,只要它和重写的父类方法同名。
【5】将实例用作属性
将某个类中的属性和方法进行集中到某个类中,并将其作为属性
【6】模拟实物

9.4导入类

【1】导入单个类
它可以将主程序文件变得整洁且易于阅读,可以将大部分的逻辑存储在独立的文件中。
【2】在一个模块中存储多个类
一个模块中的类之间应该存在某种相关性,可以根据需要在一个模块中存储任意数量的类。
【3】在一个模块中导入多个类
【4】导入整个模块
【5】导入模块中的所有类
form module_name import *
【6】在一个模块中导入另一个模块
【7】自定义工作流程

9.5Python标准库

Python标准库是一组模块,安装的Python都包含它。可以使用标准库中的任何函数和类,只要在程序开头包含一句简单的import语句
例如:from collections import OrderedDict

9.6类的编码风格

类名使用驼峰命名法,即类名中的每个单词的首字母都要大写,而不使用下划线。
实例名和模块名都采用小写格式,并且在单词之间加上下划线。
对于每个类后面都要加上一个文档字符串,简要地描述类的功能,并且遵循编写函数的文档字符串时的格式约定。
在导入标准库中的模块和自己编写的模块时,先导入标准库,然后使用空行,再导入自己编写的模块。

第10章.文件和异常

10.1从文件中读取数据

【1】读取整个文件

with open('pi_digits.txt') as file_object:
	contents = file_onject.read()
	print(contents)

关键字with在不需要访问文件后将其关闭。在这个程序中调用了open()打开,没有调用close()关闭。
如果使用open和close可能会存在问题,如果close未执行,则文件不会被关闭。如果过早close则无法访问,使用with关键字我们只管打开文件,并且在需要的时候使用它,Python在合适的时候自动将其进行关闭。
【2】文件路径
1.相对路径与绝对路径(在Linux和mac中使用‘/’,而在windows中使用‘\’)
【3】逐行读取

with open('pi_digits.txt') as file_object:
	for line in file_object:
		print(line)

【4】创建一个包含文件各行内容的列表

with open('pi_digits.txt') as file_object:
	lines = file_object.readlines()

for line in lines:
	print(line.rstrip())

【5】使用文件的内容
将文件读取到内存中后,就可以以任何方式使用这些数据了。
【6】包含一百万位的大型文件

10.2写文件

【1】写入空文件
将文本写入文件,我们只需要在调用open()函数时提供一个实参,并且告诉Python我们所需要打开的文件。

with open('pi_digits.txt', 'w') as file_object:
	file_object.write('I love programming.')

w:写入模式
r:读取模式
a:附加模式
r+:读写模式
如果省略模式参数,则为默认只读模式打开文件。
如果需要写入的我呢见不存在,则open()会自动创建它,当以’w‘模式打开文件时,文件存在,则会先清空该文件。
Python只能够将字符串存入文本文件中,要将数值型数据存入文本文件,需要先使用str()函数将其转化为字符串格式。
【2】写入多行
函数write()不会在写入的文本后面自动添加换行符,需要我们自己添加转义字符。
【3】附加到文件
如果要给文件添加内容,而不是覆盖原有,则可以使用附加模式(’a’),写入的所有信息将会被添加到文件末尾。

10.3异常

Python使用被称为异常的特殊对象用来管理程序执行期间发生的错误。每当发生让Python不知所措的错误时,都会创建一个异常对象。如果编写处理该异常的代码,则程序继续执行;如果我们未对异常进行处理,程序就将会停止,并显示一个traceback.
异常是使用try-except代码块进行处理。
【1】处理ZeroDivisionError异常
【2】使用try-except代码块

try:
	print(5/0)
except ZeroDivisionError:
	print("You can't divide by zero!")

【3】使用异常避免崩溃
发生错误时,如果程序工作还没有完成,妥善地处理错误显得十分重要,比如发生输入错误,妥善处理无效输入,就可以再次提示用户输入有效的输入,而不至于发生崩溃。

print("Give me two numbers")
print("Enter 'q' to quit.")

while True:
	first_number = input("\nFrist number:")
	if frist_number = 'q':
		break
	
	second_number = input("Second number:")
	if second_num = 'q':
		break

	answer = int(first_number)/int(second_number)
	print(answer)
	

【4】else代码块
通过将可能引发错误的代码放在try-except代码块中,可以提高这个程序抵御错误的能力,同时还需将正确运行的结果输出。

print("Give me two numbers")
print("Enter 'q' to quit.")

while True:
	first_number = input("\nFrist number:")
	if frist_number = 'q':
		break
	
	second_number = input("Second number:")
	if second_num = 'q':
		break
	try:
		answer = int(first_number)/int(second_number)
	except ZeroDivisionError:
		print("You cant't divide by 0!")
	else:
		print(answer)
	

【5】处理FileNotFoundError异常
【6】分析文本
方法split()以空格为分隔符,将字符串分拆成多个部分,并且将这些部分都存储到一个列表中。

filename = 'alice.txt'

try:
	with open(filename) as file_object:
		contents = file_object.read()
except FileNotFoundError:
	msg = "Sorry, the file " + filename + " does not exist."
	print(msg)
else:
	#计算文件大致包含多少个单词
	words = contents.split()

【7】使用多个文件
分析多个文件可以将这一套代码编写成一个函数,需要分析的文件名设置为一个实参。
【8】失败时一声不吭
pass语句,可以在代码块中使用它来让Python什么都不做
【9】决定报告哪些错误
编写得很好且经过详尽测试的代码不容易出现内部错误,如语法或逻辑错误。只会在依赖于外部因素,如用户输入、存在指定文件、有网络链接,就有可能出现异常。凭借经验判断该在程序的什么地方包含异常处理块,以及出现错误时该县用户提供多少相关信息。

10.4存储数据

很多程序都要求用户输入某种信息,然后程序将用户提供的信息存储在列表和字典等数据结构之中。当用户关闭程序时,保存这些信息,一种简单的方式是使用模块json来存储数据。
【1】使用json.dump()和json.load()
json.dump()接受两个实参:需要存储的数据以及可以用于存储数据的文件对象。

numbers = [1,2,3,4,5,6]

filename = 'numbers.json'

#写入数据
with open(filename, 'w') as file_object:
	json.dump(numbers, file_onject)

#读取数据
with open(filename) as file_object:
	numbers = json.load(file_object)

print(numbers)

【2】保存和读取用户生成的数据
假设程序运行时,我们需要尝试从文件username,json中获取用户名,因此我们首先编写一个尝试恢复用户名的try代码块。如果这个文件不存在,我们就在except代码块中提示用户输入用户名,并且将其存储在username,json中用于下次程序运行时获取它。

import json

# 如果以前存储了用户名,就加载它
# 否则,就提示用户输入用户名并存储它

filename = 'username.json'
try:
	with open(filename) as file_object:
		username = json.load(file_onject)
except FileNotFoundError:
	username = input("What is your name?")
	with open(filename, 'w') as file_object:
		json.dump(usernmae, file_object)
		print("We'll remember you when you come back, " + username + "!")
elseprint("Welcome back, " + username + "!")

【3】重构
常常遇到这样的情况:代码可以正确运行,但是可以做进一步的改进——将代码划分为一系列完成具体工作的函数。这样的过程被称为重构。重构可以让代码变得更加清晰、更易于理解、更容易扩展。
比如原来的greet_user()函数可以把它拆分成三个函数
①获取存储用户名
②提示用户输入用户名
③问候用户

第11章.测试代码

11.1测试函数

传统测试代码,在将函数中的代码进行调整后,需要在主程序中运行并且输入参数,但是这样比较麻烦。Python提供了一种自动化测试函数输出的高效方式。
【1】单元测试和测试用例
Python标准库中的模块unittest提供了代码测试工具。
单元测试用于核实函数的某个方面没有问题;
测试用例是一组单元测试,这些单元测试一起核实函数在各种情形下的行为都符合要求。
【2】可通过的测试
要为函数编写测试用例,可先导入模块unittest以及要测试的函数,再创建一个继承unittest.TestCase的类,编写一系列方法对函数行为进行不同方面的测试。
在测试类中命名,最好让它看起来和被测试函数相关,并且包含字样Test。这个类必须继承unittest.TestCase类,这样Python才知道如何运行我们编写的代码。
当运行测试类,unittest.main()时,该类中的所有以test_开头的方法都将会自动执行。
断言方法是用来核实得到的结果是否与期望的结果一致。
【3】不能通过的测试
【4】添加一个新测试

11.2测试类

【1】各种断言方法
自行查阅PythonAPI手册
举例:

# 核实a == b
assertEqual(a,b)

# 核实a != b
assertNotEqual(a,b)

【2】一个要测试的类
类的测试与函数的测试大致相似,我们所做的大部分工作都是测试类中方法的行为,但是存在一些不同之处。
【3】测试AnonymousSurvey类
【4】方法setUp()
如果unittest.TestCase类中包含方法setUp(),我们子需要创建这些对象一次,之后可以在以后测试的方法中直接使用它们。
Python将先运行setUp()方法,再运行各个以test_开头的方法。

运行测试用例时,没完成一个单元测试都将会打印一个字符:
成功时打印一个句号;
错误时打印一个字符(‘E’)
测试导致断言失败时打印一个字符(‘F’)

第12章.基础总结

通过这几天的学习(其实前前后后一共经历了5天哈哈哈,主要是保研后,人也变得懒了,学一下就想去玩,总共花费的时间可能连一天都不到),学习Python的一个基础的语法知识,和以前一些很少用到的模块,比如异常、测试等。本次学习算是一个温故而知新了。谢谢阅读!!!

你可能感兴趣的:(python,pycharm,开发语言)