Python基础教程 - Tdcqma

 

1.1 普通字符串
1.21 错误与异常
1.41 XXXXXX
1.61 XXXXXX
1.81 XXXXXX
1.101 XXXXXX
1.2 转义字符串
1.22 装饰器
       
1.3 字符串运算
1.23 高阶函数
       
1.4 字符串函数
1.24 生成器
       
1.5 字符编码
1.25 迭代器
       
1.6 注释
1.26 序列化
       
1.7 交互程序
1.27 Python反射
       
1.8 格式化输出
1.28 Socket编程
       
1.9 流程控制If-Else
1.29 Paramiko
       
1.10 While循环
 1.30 爬虫         
1.11 模块
         
1.12 列表
         
1.13 元组
         
1.14 字典
         
1.15 购物车实例
         
1.16 文件读写
         
1.17 目录操作
         
1.18 函数
         
1.19 类和对象
         
1.20 字符编码转换
         

 


 一、Python基础

  1.1 普通字符串

  字符串主要用来存储和表示文本内容的,在python中表示字符串有单引号('),双引号(")和注释用的三引号(''')三种方式。

   但是有一种情况,就是原本被双引号扩起来的内容中需要用单引号进行标记,原本被单引号扩起来的内容中需要用双引号进行标记,否则使用相同的引号进行内部标记的时候python解释器会因无法判断引号的边界而报错。

  1.2 转义字符串

  python中包需要打印一些特殊的字符的时候,比如单引号、双引号、换行符的输出需要用\进行转义。例如

   1.3 字符串运算

  字符串可以通过➕或✖️来进行运算,加号就是拼接乘号就是字符串的倍数,效果如下

    1.4 字符串函数

  python中又一些函数可以来操作字符串,比如将字符串的小写字母全部转化为大写,或者计算出某个字母在字符串中出现的次数等等,以下为部分实际例子:

     1.5 字符编码

  计算机发展初期多为英语国家使用,而英文字母个数不像汉语的数量那么庞大,因此早期采用ASCII表来进行字符编码,但是随着全球经济发展使用计算机的非英语国家数量大大增加了,而非英语国家如,日语,汉语和韩语等字符没有办法参照ASCII表进行编码,因此各个国家开始在原始的ASCII表里插入本国的字符编码表,如中国前期的扩展出了用于编码汉字的GB2312表。当然ASCII表只有两百多位可以使用,而早期的汉字个数就已经在8k以上了,因此这里所谓的“插入本国字符编码”其实是在原有的ASCII表里占用剩余的一位,然后将本国的编码表指向ASCII表中的一位而已。GB2312之后又经历GB18030,可扩展的汉字个数扩展到了2万以上了。

  与中国一样,其它很多非英语国家都逐渐扩展出来适合自己国家的字符编码表。而各种各样的编码表出现后带来的问题就是开发出的程序或其它应用在跨国展现的时候极其容易出现乱码。为了解决这个问题国际ISO的一个标准组织发布了一个统一标准,即:Unicode也叫做统一万国码。Unicode的好处是显而易见的,但是有一点也是不能忽略的,就是Unicode规定所有字符和符号最少由16位来表示,也就是2个字节(2**16=65536)。如此一来纯英文文本的存储原本只需要一个字节现在要占用2个字节了,带来的最大坏处就是极大的浪费了我们的磁盘空间。为了解决这个问题,人们在Unicode的基础上由开发出了一个存储空间可灵活扩展或缩小的编码形式,而这个编码也正是我们现在正在使用的UTF-8.

      1.6 注释

  python中的注释分为单行注释和多行注释,效果如下:

       1.7 交互程序

  使用input()可以完成用户与程序间的交互,以下代码除了应用了交互外还使用+号进行字符串拼接:

       1.8 格式化输出

  以上交互程序中使用了字符串拼接,把通过input()接收来的字符串通过+号拼接起来看起来略显杂乱。而python的字符串格式化可以完美的解决这个问题。python格式化输出的其中一种方式就是百分号的形式%。所谓的格式化字符串就是指,在字符串中使用以%开头的字符在程序中改变字符的内容,常用的字符串有以下几种类型:

 仍然以1.7的代码为例,变更如下

   另外一种格式化输出是使用.format()函数。而.format()函数在字符串标记有两种形式,即{变量}=变量,{下标}=变量的两种形式。使用时即在字符串中用{变量/下表}标记,然后字符串后跟.format(变量)来表示,语法如下:

》{变量}=变量

 》{下标}=变量

       1.9 流程控制If-Else

  流程控制语句if-else为判断条件成立时执行什么,条件不成立时执行什么,在演示if-else代码前先看一段普通的输入用户名密码的代码:

   通常情况下,输入用户名密码后需要判断内容是否正确,正确的话允许登录系统错误的话会返回一个报错信息。接下来用if-else来演示:

        1.10 While循环

  假定一个条件成立则一直执行符合条件的代码部分。以下实例在1.9流程控制If-Else的基础上演变而来,需求为用户第一次输入用户名密码时判断是否成功,如果第一次登录失败则之后的每一次都需要问一下用户是否仍要继续尝试登录,是则再次进行判断否则退出。

         1.11 模块

  模块,在Python中可理解为一个Python文件。在创建了一个脚本文件后,模块中定义了某些函数、类和变量等。你在其他需要这些功能的文件中,导入该模块,就可重用这些函数和变量。以sys和os模块为例,代码如下

  sys.path为调用python的系统环境变量,python寻找模块则会在以上路径中寻找。我们所安装的第三方的库一般会安装在site-packages这个目录里。下面看一下os模块

  注意,os.system("dir")直接输出在控制台,同时result被赋值为0,也就是执行成功的返回值。使用os.popen().read()则可以直接将整个命令执行结果赋值给result_2

  模块导入分为两种形式,即import module_name与from module_name import *两种方式,各自的调用方式均有不同;

  模块路径:

  实例1: import module_name导入

  实例2: from module_name import * 导入

  实例3: 导入其他目录下的模块

  目录结构及导入要求:

  在导入其他目录下的模块前先来看几个获取python模块路径的方法:

  导入其他目录下的模块可以将被导入模块的上层目录添加到python搜索模块的路径列表中(也就是上例中的sys.path),而如何找到该包的路径名称就可以通过上述的os.path.dirname()来逐一查找,如下所示:

  实例4:Time模块

  >时间的几种表示方法:

  >代码部分:

  实例5: Random模块

  >制作一个6位随机数字+字母验证码

  实例6:OS模块

  实例7: SYS模块

  >sys.exit()退出程序

  >sys.argv获取参数(需要在终端进行实验)

  实例8: shutil模块(高级的文件、文件夹、压缩包处理模块)

  >shutil.copy()模块复制文件

  >shutil.copyfileobj()复制文件到另一个文件

  实例9: hashlib模块,用于加密相关的操作提供了MD5、SHA224,SHA256、SHA512等算法。

  将"hello python"字符串转换成16进制md5值。

  一个md5对象每次update一个内容都会进行叠加,例如m1 = hello ,m1 = world , m1 = 123,那么最后一次m1.hexdigest()的md5值的对象其实是helloworld123,如:

  将"hello python"字符串转换成16进制sha256值。 

  将包含中文的字符串转换成16进制md5值 

  实例10: re模块(正则表达式)

  常用正则表达式符号

  匹配特定字符开头

  匹配开头是任意字符,第二位是数字

  匹配开头是任意字符,后面跟着连续N位都是数字

  匹配结尾是否是由连续N位数字结束

  匹配*号前的字符0次或多次

  匹配指定长度的数字,N{m}代表匹配N这个字符m次,注意看re.search与re.findall的区别

  匹配所有出现指定范围内的数字,[0-9]{a,b}代表出现a到b次0-9之间的任意数字

  匹配 |(或)左右两边的字符

  匹配分组,用()扩起来的可以看作一个单独的对象进行匹配

  \A代表匹配开始字符,\Z代表匹配结束字符

  匹配除了数字之外的其他任意字符

  匹配[0-9a-zA-Z]字符,用\w来表达,匹配除了[0-9a-zA-Z]之外的字符用\W来表达。

  匹配空白字符

         1.12 列表

  列表是一个数据集合,用[ ]扩起来且以“,”进行分割,列表里面可以包含任何数据类型,如对象、列表等等。

         1.13 元组

  元组可以看成是一组特殊的列表,与列表不同之处在于元组一经创建就不能被改变了,即不能对元组里的数据进行删除、更改甚至添加。因此元组通常用于存放一组不允许被用户修改的数据。另外,列表使用[ ]扩起来,而元组则是使用( )扩起来。

          1.14 字典

  字典(dict)也是一种数据类型,是由大括号{ }括起来同时以“键:值”对的形式来表现的,字典不像列表有下标,字典里没有下标概念所以字典是无序的。而如果想要访问字典里的内容则需要通过“键”来访问“值”

          1.15 购物车实例

  需求:

    1. 要求用户输入一个金额,然后打印商品列表

    2. 用户对想要买的商品通过商品编号将商品加入购物车

    3. 用户可多次添加商品到购物车,订单金额小于用户输入金额允许购买,否则提示余额不足。

          1.16 文件读写

  文件和文件处理是任何高级语言都不可缺少的一部分,Python语言提供了丰富的文件操作功能,包括文件读写操作、处理文件中的数据、fileinput操作文件及目录操作等等。

  测试读写文件1:testfile.txt

  测试读写文件2:pythonFile.txt

   测试代码:

   实例1: 使用while循环打印readline()

    实例2: 使用for循环打印readline()

  实例3: 定义一个函数,只打印文件中偶数行的内容

  实例4: 使用with语句来进行文件管理,同时定义函数只打印奇数行内容

   实例5: 使用fileinput模块读取两个文件到列表中,然后依次识别文件名,并打印单一文件行数、总文件行数以及文件内容,line.strip()去掉空白行,同时找出包含'会'与'A'的行。

  1.17 目录操作

  python的os模块提供了一些操作文件和目录的功能,可以很方便的重命名文件名、添加删除目录、复制目录文件等操作。

  实例1: 批量收集文件,并汇总各类信息到excel表格

  用户需求:

   代码实现:

  1.18 函数

  Python函数类别有内建函数和自定义函数,其中内建函数就是以上实例中多次用到的方法,例如range(),input()及数据类型转换函数等等。但是很多时候开发者需要解决自己的实际问题的时候内建函数未必够用,这个时候就需要自己写函数了,这个就是所谓的自定义函数。而使用函数的好处就是可以调用函数来完成一些重复性的工作,且结构清晰易于维护。

  声明函数

  应用函数:

  实例1: 充分理解函数调用的可重用性,一致性以及可扩展性

  实例2: 函数返回值的几种形式

  1.19 类和对象

  Python中具有相同属性或能力的模型在面向对象编程中以类进行定义和表示的,由类可以派生出(实例化)出同类的各个实例就是对象。

  定义类:

   实例化:

  类的方法

  构造方法

  构造函数中存在指定的参数时,实例化对象时必须给定相应的参数

  类中方法内部调用全局函数

  类的属性

  类的成员方法和静态方法

  类的私有属性和私有方法

  类的继承

  多重继承

  广度继承

  继承关系如上所示,广度继承是即为最下层的classD继承后函数的执行优先顺序是B->C-A,如下图所示:

        

  从以下四个场景来看广度继承的关系:

  场景1: class D有自己的方法,执行自己的方法

  场景2: class D没有自己的方法,执行class B的方法

  场景3:class D没有自己的方法,class B也没有自己的方法,执行class C的方法

  场景4:class D没有自己的方法,class B也没有自己的方法,class C也没有自己的方法,最后执行class A的方法

  方法重载

  __doc__查看类的描述信息

  __module__ & __class__确认类的出自及类名信息 

  __call__:通过对象()调用函数

  __dict__:查看类或成员当中的所有成员,以字典的形式输出

  __str__ : 如果一个类中定义了__str__方法,打印对象时默认输出__str__()方法的返回值

  1.20 字符编码转换

  当国内采用UTF-8字符编码写出的软件要在日本使用的时候,由于两国间的字符编码不同就会出现乱码的现象,Python中通过字符编码转换可解决这个问题。打个比方,众所周知的unicode(也叫万国编码),如果要想将原本使用GBK编码写出的软件转换成UTF-8编码的时候,就可以借助unicode作为中间人来进行转换。转换的大致思路如下图所示: 

  

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

  1.21 错误与异常

  Python常见的基本错误有两类,一类是语法错误,另一个类是程序异常。语法错误:通常使用Pycharm等第三方IDE的时候如果出现语法错误在编程的时候会给出提醒,尽量在程序调试过程中就消除此类语法错误。程序异常:异常不是在编写代码时出现的错误,而是在程序运行时出现的错误,而如果对运行中的程序没有进行异常处理那么程序就会终止运行。

  语法错误:

   异常错误:

   finally语句执行

   except语句用法

   Raise手工抛出异常

  1.22 装饰器

  定义:

    本质是函数,用于装饰其他函数,说白了就是为其他函数添加附加功能。

  原则:

    1>不能修改被装饰的函数的源代码

    2>不能修改被装饰的函数的调用方式

  实例1: 统计程序运行时间的装饰器

  实例2: 在普通函数执行前添加开始与结束语句

   1.23 高阶函数

  高阶函数,满足以下两个条件中任意一个即可称之为高阶函数

    a> 把一个函数名当作实参传给另外一个函数(在不修改被装饰函数源代码的情况下为其添加功能)
    b> 返回值中包含函数名(不修改函数的调用方式)

  1.24 生成器

  假如一个列表里有1000万个元素,如果我们只想读取列表里的前5个数据,那么程序依然会把包含1000万个元素的列表一下子都读到内存里,如此一来极大的浪费里内存空间,也浪费了硬盘空间。Python中的生成器机制可以生成一个[值的序列]用于迭代,并且这个值的序列不是一次生成的,而是使用一个再生成一个,可以使程序节约大量内存。生成器对象是通过使用yield关键字定义的函数对象,因此生成器也是一个函数。此外生成对象可以直接被for循环遍历,也可以手工进行遍历。

  实例1:自定义一个递减数字序列的生成器,使用for循环遍历 

  实例2:  自定义一个递减数字序列的生成器,使用手工遍历,__next__()

  实例3:  ( i * i for i in range(10)) 使用括号扩起来然后赋值给scq,则scq就是一个生成器了,此时可以使用for循环进行遍历,也可以使用手工的方法进行输出。以下代码显示手工输出到一部分后继续使用for循环遍历输出。 

  实例4: 生成器函数,以斐波那契数列为例,当使用print()打印时则为普通函数,当使用yield打印时则为生成器函数。

  1.25 迭代器

  实例1:判断是否是可迭代对象与是否是迭代器

  实例2: 将可迭代对象转换为迭代器

  1.26 序列化

  序列化是将Python中的列表、元组、字典等基本数据类型转换为字符串的过程;而反序列化是指将字符串转换为python的列表、元组、字典等对象的过程,在Python中与序列化相关的两个模块:json和pickle。

  实例1: 序列化,使用json.dumps()将字典数据类型进行序列化操作,(字典 -> 字符串)

  实例2: 反序列化,使用json.loads()将字符串类型转化为字典类型,(字符串->字典)

  实例3: 基于天气API获取JSON数据(http://wthrcdn.etouch.cn/weather_mini?city=上海) 

  实例4: 序列化,使用pickle.dumps()将列表数据类型进行序列化操作,(列表 -> 字符串)

   以上代码使用pickle.dumps()将python列表序列化成了字节类型,这种输出方式虽然人无法识但在python之间是可以识别。另外,如果想要反序列化成列表格式可以使用pickle.loads()方法:

  实例5: json与pickle的序列化区别

  1.27 Python反射

  Python反射包括四个方法:getattr、hasattr、setattr、delattr,分别用于获取成员、检查成员、设置成员、删除成员。

   获取一个来自客户端的参数,进行反射案例演示

  1.28 Socket编程

  网络概念:

  socket编程

  客户端和服务端

1
大多数连接都是可靠的TCP连接。创建TCP连接时,主动发起连接的叫客户端,被动响应连接的叫服务器。

  socket服务端建立连接流程图

 

  Socket客户端建立连接流程

  实例代码,本地搭建客户端与服务端模拟通信

  服务端:

  客户端:

  实例代码:运行服务端使之处于监听状态,在客户端发起请求

  实例代码:socket实现简单SSH功能

  服务端:

  客户端:

  测试SSH连接:


  实例代码:socket实现简单FTP功能(测试环境为ubuntu,其中服务端与客户端均在同一台机器)

  服务端:

  客户端:

  测试FTP文件发送

  用socketserver模块建立服务器

   代码部分(服务端)

   代码部分(客户端) 

  代码测试:

  1.29 Paramiko

  paramiko是一个基于SSH用于连接远程服务器并执行相关操作的一个模块,其中SSHClient可以实现SSH的功能,SFTPClinet可以实现SCP的功能。

  实例代码:paramiko实现简单SSH功能

  实例代码:paramiko调用SFTPClient方法,实现scp功能

  实例代码:paramiko基于公钥认证实现SSH连接

  1.30 爬虫 

  爬虫简介...

  Requests模块:发送get请求

  Requests模块:发送post请求,尝试登录操作,post登录请求数据需要借用浏览器查看元素(网络),例如查看登录数据的内容

 

 

 

 

 

   

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

《持续更新中》

 

posted @   北海悟空  阅读(786)  评论(0编辑  收藏  举报
编辑推荐:
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
阅读排行:
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 地球OL攻略 —— 某应届生求职总结
· 提示词工程——AI应用必不可少的技术
· Open-Sora 2.0 重磅开源!
· 周边上新:园子的第一款马克杯温暖上架
点击右上角即可分享
微信分享提示