Python编程 - 从入门到实践「笔记 - 01」

Python编程–从入门到实践(第一部分)

第一章 数据类型

字符串

  • 用引号括起来的都是字符串(单引号/双引号都可)

    字符串中可以包含引号

    正确使用单、双引号

    单引号应该位于两个双引号之间

string的函数
  • 大小写有关

    • title() : 首字母大写的方式显示每个单词
    • upper()
    • lower()
  • 合并(拼接)

    • ‘+’ 可以实现拼接字符串
  • 空白/换行

    增加空白

    • 字符串中使用制表符 \n \t

    删除多余的空白

    • rstip() 删除字符串末尾的空白
    • lstrip() 删除字符串开头的空白
    • strip()同时删除开头和结尾的空白
  • 分隔

    • split() 以空格为分隔符将字符串分拆成多个部分,返回一个列表

数字类型

整型
  • 可执行加减乘除运算
  • 特殊的 ******表示乘方运算
  • // 表示整除
浮点型

注意:由于计算机内部存储浮点数的方式,导致存储一个确定的浮点数 只会 无限的接近 。

类型转换

函数str() 会让Python将非字符串值表示为字符串

int()可以将字符串转化成int

float()同上

第二章 列表

基本操作

索引
  • 下标从 0 开始

  • 索引 [ - 1] 表示最后一个元素, -2 就表示倒数第2个

    列表的状态都是动态的,可以增加 和 删除 、改

增删
  • append()函数添加新元素到尾部

  • insert(index, ‘’)添加元素到索引index(0-max)前面 就是代替list[index] 后面的后移一位

    根据索引删除

  • pop()弹出列表末尾的元素并返回

  • pop(index)弹出指定索引的元素,并返回

  • del list[key] 注:没有括号 根据 列表[索引]指定删除哪一个 。特点是 删除了 且 得不到其元素

    根据值来删除

  • remove(value)只删除第一个指定的值,

组织列表-排序

按字母顺序组织

  • sort()对列表按字母顺序进行永久排序

    列表只能包含同种类型数据才可以排序,不可以数字+ str

    sort函数可以通过传递参数设置排序顺序 比如: reverse=True 则按逆序进行排序

  • sorted()对列表进行临时排序

    列表元素保留原来的排序顺序,显示的时候以特定顺序显示

    使用方法为: sorted(list)也可以传递参数sorted(list,reverse=True)

对元素反转

  • reverse()永久性的修改列表的排列顺序,还可以随时恢复原来状态

列表长度

  • len(list)

操作列表

遍历列表
  • for-in循环遍历 遍历结束的时候 终值还保存在变量中

  • python解释器按缩进判断是否同属一个循环,因此不合适的缩进会造成错误

数值列表
  • range(1,5)函数 实际会生成1-4的数字,差一问题的出现

    返回的是range类, 可以通过list(range())函数转换成数值列表

    • range(start,end,步长)可以指定步长,
  • min、max、sum 对数值列表进行统计计算。

    min(list)

列表解析⚑

生成列表的时候,一般先创建一个空的列表,for-in循环加入值,可以二者合一生成列表

square = [ a**2 for a in range(1,10) ]

使用部分列表-切片

切片可以访问列表的部分值 list[start,end] 和range()一样存在差一现象

适用于

  • 复制列表

    • 整个列表 : a=b[:]

      如果简单的 a=b 这两个变量都指向同一个列表,造成对某一个列表修改其元素,另一个的也会修改,因为都是指向的同一个列表

元组 tuple

列表适合存储程序运行期间可能变化的数据集,是动态可修改的。而元组可以实现创建一系列不可修改的元素的列表,存储的一组值在程序的整个运行周期内都不可变。

  • 定义:dimensions = (1,2,3)

  • 元组的元素不可修改

    但是可以创建同名元组变量进行重新赋值

Python代码格式设置指南

PEP-8 标准
缩进等规则

第三章 if

检查是否相等

  • 比如网站用户搜索的时候 需要对其键入的搜索值转换成lower()小写之后和库的内容进行比对(而库里统一存储小写标题等信息)
  • 使用 ==
  • 检查不等 !=

检查多个条件

  • 与 and
  • 或 or
  • 非 !
  • in 是否在列表中
  • not in
与列表结合
  • 判断列表是否为空

    if list:将列表名放在条件表达式中,当列表至少包含一个元素的时候返回真

第四章 字典

字典是一种动态结构,可以随时添加键值对。

访问
  • 通过key 访问value
添加键值对

直接给一个新的键 赋 值即可, 添加之后的键值对顺序与排列顺序并不相同,Python只关心键与值的对应关系

创建字典,一般先创建一个空字典,然后再通过上面的方法进行一个一个添加

删除键值对
  • del a[‘key’] 将key 彻底删除 键 与 值
字典遍历
for k, v in dic.items():
	print('key: ' + key)
	print('value' + value)
  • items()返回键值对列表 , 将每个键值对存储到两个不同的变量中。

    >>> dic.items()           
    dict_items([('name', 'Foubaby'), ('year', 18)])
    

    遍历字典的时候,键值对的返回顺序也和存储顺序不是一样的,

  • keys() 返回字典的键的列表

    也可以直接对字典名进行遍历, 默认也是遍历键

因为字典总是关注键与值之间的对应关系,而不关注元素按什么顺序存储的,因此遍历得到的元素顺序不一定和存储的顺序一样

  • 怎么按序进行遍历字典项呢?-- 有序字典 OrderedDict

使用标准库 collections 中的 类 OrderedDict 创建此字典实例

from collections import OrderedDict
dic = OrderedDict()
  • 按序遍历字典的键

    for name in sorted(dic.keys()):
    	...
    
  • values()遍历得到所有的值 的 列表 不包含任何键

    只取字典的值的话 会有很多重复值,要想去重操作

集合

提取一个字典中不同的值

  • 使用set()将得到的列表转换成集合

    集合里的元素每一个都是独一无二的

嵌套

字典 与 列表 相互嵌套

  • 字典中一个键 关联多个值的时候 就需要使用 列表作为value

第五章 while 和 用户输入

获取输入

  • input()等待用户输入,并在按回车之后继续运行。

    默认将用户输入转化成字符串

  • int()获取数值输入

    将input()返回的变量用int()转换格式,int(input())

while

  • 使用标志

    active = True 通过不同条件修改active属性值,while(active)

  • break

  • continue

  • 删除列表中指定值的项

    while 'cat' in list:
    	...	
    
  • 判断列表是否空

    while list_name:
    	...
    

第六章 函数

定义

def 关键字

实参 && 形参

实参传递值赋给形参, 是简单的浅拷贝

实参的对应

位置实参
  • 按顺序将函数调用中的实参关联到函数定义中的形参

  • 实参顺序严格一致

    def animal(type, name):
    
    animal('dog', 'Palu')
    
关键字实参
  • 进行函数调用的时候明确指出实参对应的形参

  • 关键字实参的顺序不重要

  • 务必准确的指定形参名

    def animal(type, name):
    
    animal(type= 'dog', name= 'Palu')
    
默认形参
  • 形参没有对应实参的时候,采用默认值

    def ani(petname, anitype='dog'):
         print(petname + anitype)
    

    带默认值的形参要放在参数列表的最后面,为了在调用的时候位置实参对应的都是前面的无默认值实参,对位置实参进行正确解读。

  • 通过设置默认形参为空,实现实参的可选,用户没有输入任何值的时候调用默认值空。

返回值

函数可以返回任意类型的值,包括字典、列表等复杂结构,传递和都是通过对象名

返回字典

通过return dic

传递列表

将列表作为实参进行传递给形参属于深拷贝,在函数里修改形参元素,实参的元素也随之修改。如果不想修改实参的值,可以使用切换传递实参a[:] 实际上只是传递了一个副本

缺点: 会产生时间和内存开销去保存副本

传递任意数量的实参⚑

实现接收不同数量的实参

  • 函数的形参设置为:

    def func(*arg)
    

    *arg的* 表示创建名为arg 的空元组,实参传来的所有值都封装到这个元组

同时使用位置实参和任意数量实参

如果函数要接受不同类型的实参,需要将接受任意数量实参的形参(*arg)放在形参列表的最后。先匹配位置实参和关键字实参,余下的实参都传递给最后一个形参中。

def func(size, *arg):
	...
	
func(12,'a','b','c')
使用任意数量的关键字实参⚑

实现接收多个类型的实参

def func(first, last, **user_info):
	''' user_info 是一个字典 '''
	...
	
func('wang','sun', old = 19, like = 'music')

形参**user_info**的两个星号表示创建一个空字典

函数存储到模块中 ⚑

  • 导入整个模块

    模块就是扩展名为.py的文件 比如test.py 有一个函数 func()

    import test
    test.func()
    

    实际上是Python将test.py的全部函数复制到当前程序中,便可以使用test.py中定义的全部函数。

  • 导入特定的函数

    from test import func
    func()
    
  • 使用as给函数或模块重命名

    from module_name import function_name as fn
    
    import module_name as mn
    
  • 导入模块中所有函数

    from test import *
    
    func()
    

    注意: 使用不是自己编写的大型模块的时候,最好不要使用这种方法,防止模块中有的函数名称和自己定义的函数名称相同,会导致覆盖函数的错误。

    最佳的做法: 要么导入整个模块,使用句点符进行调用函数,要么只导入需要的函数。

函数编写指南

  • 函数名使用小写字符和下划线隔开

  • 函数下面要有文档字符串

    def get_name(object):
    	""" 得到对象的名字 """
    
  • 形参指定默认值和函数调用关键字实参的时候,等号两边不要有空格

  • 函数与函数之间用两行空格隔开


第七章 类

类的创建

class Dog():
	
	def  __init__(self, name, age):
		self.name = name
		self.age = age
		
	def sit(self):
		print(self.title() + 'is now sitting. ')
		
	def roll_over(self):
		print(self.name.title() + 'is rolling over. ')
  • init ()方法

    是一个特殊的方法,创建Dog类的实例的时候,自动运行它

    形参 self 必要的,需要在name,age前面, 调用此方法的时候自动传入实参self, 每个与类相关联的方法调用都自动传递实参self , 是一个指向实例本身的引用 , 让实例可以访问类中的属性和方法。

    没有显示的包含return 语句,但是返回创建的类的实例

  • 类每个方法如果要使用类的属性,也要设置第一个形参为self

  • 给属性设置默认初始值

    就不用在__ init __ 函数的参数中设置此形参

    def __init__(self, name):
    	self.name = name
    	self.age = 20
    
    
  • 修改属性的值

    • 直接通过实例的访问来修改 .age = 18
    • 通过方法修改属性的值

类的继承

一个类继承另一个类的时候,自动获得另一个类的所有属性和方法。

  • 创建

    class Little_Dog(Dog):
    	
    	def __init__(self, name, age, color):
    		super().__init__(name, age)
    		self.color = color
    
    • 父类代码需要在子类代码的前面
  • 重写父类的方法

    子类的实例调用此方法将忽略父类的此方法。

  • 类的实例作为类属性

导入类⚑

将类存储在模块中,主程序中导入这个模块

  • 多个相关的类可以存储在一个模块中,

    from car import Car, ElectricCar
    
  • 导入整个模块

    import car
    car.Car('', '')
    
  • 在一个模块中导入另一个模块的类

Python标准库

标准库就是一组模块,Python默认安装的,比如

可以下载外部模块。命令行下通过 pip install module_name 进行需要的库的安装

类编写风格指南

  • 类名采用驼峰命名法,单词的首字母大写,不采用下划线
  • 实例名和模块名采用小写的方式,单词之间加上下划线。
  • 类定义后面跟一个文档字符串,描述类的相关信息
  • 模块也应该包含文档字符串
  • 类中使用一个空行分隔方法,模块中使用两个空行分隔类
  • 同时导入标准库和自己编写模块的import语句时:先导入标准库, 再导入自己写的模块的类/方法,中间用空格隔开

第八章 文件和异常

文件中读取数据

要使用文本文件中的信息,首先要将信息读进内存中。可以一次性读取全部内容 或者 每次一行的方式进行读取。

读取整个文件
with open('xx.txt') as file_object:
	contents = file_object.read()
	...
  • open()函数做了大部分工作,要使用文件 必须 打开再读取。返回一个表示文件的对象。

默认从当前程序的所在目录下寻找此文件,可以指定文件路径

  • 相对路径:

    with open('test/xx.txt')
    或者
    with open('test\xx.txt')
    

    从当前程序的目录下的test字文件夹寻找文件

  • 绝对路径

    详细路径 ‘C:Users\ …’

  • 按照标准: 我们需要在with 中对打开的文件进行 关闭 通过close()

    但是close()时机的不适当 或者 由于bug未调用 close()会导致数据丢失 或 受损

    所以,只管用with open打开文件, python会在合适的时候自动关闭文件

  • read()函数读取文件的全部内容

    read()读取的内容到达文件末尾的时候会返回一个空字符串,显示出来就是一个空行,删除可以通过rstrip()i

逐行读取
with open(filename) as file:
	for line in file:
		...

问题: 在打印输出的时候,每输出一行,就多一行空白行,因为每行的末尾都有一个看不见的换行符,而且print()语句也会加上一个换行符,因此每行末尾有两个换行符。

怎么消除呢?

通过print(line.rstrip())函数

创建包含文件各行内容的列表

可以将文件内容存储在一个列表中,这样with 代码块外部也可以用这个文件内容

  • file_object.readlines()

    for line in lines:
    	...
    

    with 代码块外面可以访问文件内容。

文件内容使用

上面open是将文件内容读入内存,之后就可以进行各种操作了

读取文件的时候,python将其中所有文本解读为字符串,进行别用的话需要进行数值类型转换。

读取文件的时候,如果文本文档中包含中文,而代码报错显示

‘gbk’ codec can’t decode byte 0x97 in position 0: incomplete multibyte sequence

是编码的问题,可以采用

  • with open('test.txt', encoding='UTF-8') as file:来打开文件

写入文件

要实现文本写入,调用open()函数的时候需要提供另一个实参,表明以什么方式打开文件。

  • open(filename, 'w')

    以写入的模式打开这个文件

  • 其他的

    ‘r’ 读取模式 ‘a’ 附加模式 'r+ '能够读取+写入

    默认以只读的方式打开文件

  • 要写入的文件不存在,会自动创建此文件

    如果已经存在,会在返回文件对象前清空文件。慎用 此模式 因此一般使用’r+'

  • python 只能将字符串写入文本文件,要将数值写入文本文件,必须先使用函数str()将其转换成字符格式

  • write()函数不会在写入的文本末尾添加换行符,因此写入多行的时候需要添加换行符

以上方式写入文件都是清空文件原来的内容进行覆盖,或者创建不存在的文件,如何保留原来的内容进行增添呢?

  • ‘a’ 的模式 不会在返回文件对象前清空存在的文件内容,文件不存在会创建此文件
  • 并且将写入的行添加到文件末尾

异常

python 使用称为 异常的 特殊对象来管理程序运行期间发生的错误,异常通过try - except 代码块处理。

完整的try - except - else 代码块结构

  • try

    将可能导致错误的代码行 放在try 代码块中

  • 如果try中的代码块导致来错误,将查找对应的except代码块,并运行其中的代码, 显示一条友好的错误消息,而不是在终端显示一条 traceback

    也可以使用pass语句 失败时一声不吭 pass充当占位符,表示什么也不做

  • else 代码块:

    在except 后面添加else 代码块,如果try代码块正确执行,那么转为else

    正常执行的主要的函数功能写在 else 代码块中

常见的错误对象 – 异常

  • FileNotFoundError 异常 由open()函数导致的
  • jZeroDivisionError 异常 由除0 导致的

存储数据 – json

对用户输入的信息,可以通过列表 、字典存储到内存中,但是用户关闭程序就没了,所以需要保存用户输入信息到文件。

可以使用json模块 : 实现简单的数据结构存储到文件中,并且程序再次运行时,加载文件的数据。

Json使用
  • json.dump(data, file_obj) 参数为 数据结构,以可写方式打开的文件对象。

    实现将数据data转存到文件对象 通过文件对象的扩展名是 .json格式的

  • json.load() 数据读取到内存

    参数是文件对象

    加载存储在.json文件中的信息, 存储的是什么类型的数据就返回什么类型的对象

保存和读取用户生成的数据 - 作为日志文件

  • 实现记住用户名称,下次进入程序的时候就可以从文件中读取用户名,并对其发出问候。

第九章 测试

测试函数

**单元测试 和 测试用例 **

  • 单元测试: 核实函数的某个方面没有问题
  • 测试用例: 是一组单元测试,一起核实函数

怎么进行测试? 使用模块 unittest

  • 导入模块unittest 和 测试的函数

  • 创建一个继承unittest.TestCase的类,编写一系列的测试方法

    import unittest
    from name_function import func
    class NamesTestCase(unittest.TestCase):
    	
    	def test_first(self):
    		...
    		self.assertEqual(anwser, final)
    		
    unittest.main()
    
    • 类名一般要与 测试的函数名有关,并包含Test字样,「必须包含继承 unittest.TestCase」
    • 包含的方法名 必须以test_ 打头,运行测试文件时,test_ 方法自动运行。
    • 测试结果是否和期望值一样,调用unittest.assertEqual()方法,「断言方法
    • 可以设置多个这样的测试函数实现对函数的多个方面进行测试
    • 或者将测试用例存储在列表中,在一个测试函数中通过for循环进行检测

测试类

unittest 的断言方法有很多种

  • assertEqual(a,b)
  • assertNotEqual(a,b)
  • assertTrue(x)
  • assertFalse(x)
  • assertIn(item, list)
  • assertNotIn(item, list)

编写测试类

  • 导入 unittest 和 对象类所在模块

  • 构建测试类 继承 unittest.TestCase

  • 测试方法

    • 可以在每一个测试方法中 创建对象类的实例 然后进行测试

    • 也可以统一创建1个类的实例对象

      SetUp(self)方法

      • 将 对象类的实例作为当前测试类的属性
      • 设置测试用例的列表 同样作为 测试类的属性

      在不同的测试方法中通过属性调用对象实例的方法进行测试

  • 最后通过 unittest.main() 启动测试

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值