一、基础教程
2.1 基本知识点
python默认的编码格式是ASCII格式;需要使用# -*- coding: UTF-8才能读取中文。
python能进行交互式编程,脚本式编程。
python标识符由字母、数字、下划线组成。
以单划线开头_foo表示不能直接访问的类属性,需要通过类提供的接口进行访问,不能用from xxx import *而导入。
以双下划线开头的 __foo 代表类的私有成员。
以双下划线开头和结尾的 foo 代表 Python 里特殊方法专用的标识,如 init() 代表类的构造函数。
python中所有代码块语句必须严格包含相同的缩进空白数量。
python3中有6个标准的数据类型:数字Number,字符串String,列表List,元组Tuple,集合Set,字典Dictionary。
其中不可变数据3个:数字Number,字符串String,元组Tuple。
可变数据3个:列表List,字典Dictionary,集合Set。
python3中数字Number有四种类型:整数int,布尔型bool,浮点数float,复数complex(1+2j)。
python中的循环语句有for和while,没有do...while。
python中pass语句是空语句,是为了保持程序结构的完整性。pass不做任何事情,一般用做占位语句。
2.2 重要知识点
---------first---------
迭代器:方法iter()和next(),迭代器对象从集合的第一个元素开始访问,直到所有的元素被访问完结束。迭代器只能往前不会退后。把一个类作为一个迭代器使用需要在类中实现两个方法 iter() 与 next() 。StopIteration 异常用于标识迭代的完成.
生成器(generator):使用了yield的函数被称为生成器。跟普通函数不同的是,生成器是一个返回迭代器的函数,只能用于迭代操作,更简单点理解生成器就是一个迭代器。调用一个生成器函数,返回的是一个迭代器。
函数:能提高应用的模块性,和代码的重复利用率。def area(width, height):
在 python 中,strings, tuples, 和 numbers 是不可更改的对象,而 list,dict 等则是可以修改的对象。例如a=5后再令a=10,实际上是新生成了一个int值对象,再让a指向它,而5被丢弃。而la=[1,2,3,4]后再赋值la[2]=5,则是剪list la的第三个元素值更改,本身la对象没有动,只是其内部的一部分值被修改了。
参数传递:
不可变类型:类似 c++ 的值传递,如 整数、字符串、元组。如fun(a),传递的只是a的值,没有影响a对象本身。比如在 fun(a)内部修改 a 的值,只是修改另一个复制的对象,不会影响 a 本身。
可变类型:类似 c++ 的引用传递,如 列表,字典。如 fun(la),则是将 la 真正的传过去,修改后fun外部的la也会受影响。
python的作用域:
局部作用域L:Local
闭包函数外的函数中E:Enclosing
全局作用域G:Global
内置作用域B:Built-in
变量查找的规则是L->E->G->B;即:在局部找不到,便会去局部外的局部找(例如闭包),再找不到就会去全局找,再者去内置中找。
当内部作用域想修改外部作用域的变量时,就要用到global和nonlocal关键字了。
-------second-------
python的数据结构:
列表[,]:可变,列表推导式[3*x for x in [2,4,6] ]提供了从序列创建列表的简单途径,列表嵌套。
列表作为堆栈使用:后进先出。append()方法可以把一个元素添加到堆栈顶。用不指定索引的pop()方法可以把一个元素从堆栈顶释放出来。
列表作为队列使用:先入先出,效率不高。from collections import deque,然后append()方法加入队列,popleft()方法弹出队列。
元组(,):由若干个逗号分隔的值组成。
集合{,}:是一个无序不重复元素的集。
字典{}:可以看成无序的键=>值对集合。字典以关键字为索引,关键字可以是任意不可变类型,通常用字符串或数值。
模块:是一个包含所有你定义的函数和变量的文件,其后缀名是.py。其可以被别的程序引入,以使用该模块中的函数等功能。
import语句:当解释器遇到 import 语句,如果模块在当前的搜索路径就会被导入。搜索路径是一个解释器会先进行搜索的所有目录的列表。
__name__属性:由于一个模块被另一个程序第一次引用时,其主程序将运行。如果想在模块被引入时,模块中的某一程序块不执行。我们可以使用__name__属性来使该程序仅在该模块自身运行时执行。例如
if __name__ == '__main__':
print('程序自身在运行')
else:
print(‘我来自另一模块’)
标准模块:直接被构建在解析器中,直接import导入即可。例如:import sys
包:是一种管理python模块命名空间的形式,采用“点模块名称”。例如,一个模块的名称是A.B,那么他表示一个包A中的子模块。在导入一个包的时候,Python 会根据 sys.path 中的目录来寻找这个包中包含的子目录。目录只有包含一个叫做 init.py 的文件才会被认作是一个包。用户可以每次只导入一个包里面的特定模块,例如:import sklean.model_selection,其下必须有一个__init__.py函数。
从一个包中导入*,即Python 会进入文件系统,找到这个包里面所有的子模块。
二、高级教程
2.1 网络编程:
python提供了两个级别访问的网络服务:
低级别的网络服务支持基本的 Socket,它提供了标准的 BSD Sockets API,可以访问底层操作系统Socket接口的全部方法。
高级别的网络服务模块 SocketServer, 它提供了服务器中心类,可以简化网络服务器的开发。
Socket:又称套接字,应用程序通常通过“套接字”向网络发出请求或者应答网络请求,使主机或者一台计算机上的进程间可以通讯。socket实现进程间通信。python中语法如下:
socket.socket([family[, type[, proto]]])
- family:套接字家族可以使AF_UNIX或者AF_INET
- type:套接字类型可以根据是面向连接的还是非连接分为SOCK_STREAM或SOCK_DGRAM
- protocol:协议一般默认为0.
例如:socket.socket([AF_UNIX[, SOCK_STREAM[, 0]]])
(1)服务器:文件名——server.py
服务端套接字:
s.bind()绑定地址。s.listen(5)开始TCP监听,最大连接数为5。s.accept()被动接受TCP客户端连接,等待连接的到来。
#!/usr/bin/python3
import socket
import sys
#(1)创建socket对象
serversocket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
#(2)获取本地主机名
host = socket.gethostname()
#(3)设置端口号
port = 9999
#(4)绑定端口号
serversocket.bind((host, port))
#(5)设置最大连接数,超过后排队
serversocket.listen(5)
while True:
# 建立客户端连接
clientsocket, addr = serversocket.accept()
print("连接地址:%s" % str(addr))
message = "欢迎访问博客!" + "\r\n"
clientsocket.send(message.encode('utf-8'))
clientsocket.close()
(2)客户端:文件名——client.py
客户端套接字:
s.connect()主动初始化TCP服务器连接,返回的address一般是元组(hostname,port)。s.connect_ex()是connect的扩展版本,出错时返回出错码,而不是抛出异常。
#!/usr/bin/python3
import socket
import sys
#(1)创建socket对象
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
#(2)获取本地主机名
host = socket.gethostname()
#(3)设置端口号
port = 9999
#(4)连接服务,指定主机和端口
s.connect((host, port))
#(5)接收小于1024字节的数据
message = s.recv(1024)
s.close()
print(message.decode('utf-8'))
公共用途的套接字:
s.recv()接收TCP数据,数据以字符串形式返回。s.send()发送TCP数据,将string中的数据发送到连接的套接字。s.close()关闭套接字。
python Internet模块:
协议功能用处端口号Python 模块
HTTP网页访问80httplib, urllib, xmlrpclib
NNTP阅读和张贴新闻文章,俗称为"帖子"119nntplib
FTP文件传输20ftplib, urllib
SMTP发送邮件25smtplib
POP3接收邮件110poplib
IMAP4获取邮件143imaplib
Telnet命令行23telnetlib
Gopher信息查找70gopherlib, urllib
2.2 多线程:
多线程类似于同时执行多个不同程序,多线程运行优点:
使用线程可以把占据长时间的程序中的任务放到后台去处理。
程序的运行速度可能加快。
2.3 python3 MySQL编程:
pyhon可以使用mysql-connector来连接使用MySQL,mysql-connector是MySQL官方提供的驱动器。
(1)创建数据库连接
import mysql.connector
mydb = mysql.connector.connect(
host="localhost", # 数据库主机地址
user="yourusername", # 数据库用户名
passwd="yourpassword" # 数据库密码
)
print(mydb)
(2)创建数据库
mycursor = mydb.cursor()
mycursor.execute("CREATE DATABASE runoob_db")
(3)创建数据表
mycursor = mydb.cursor()
mycursor.execute("CREATE TABLE sites (name VARCHAR(255), url VARCHAR(255))")
(4)主键设置
mycursor = mydb.cursor()
mycursor.execute("ALTER TABLE sites ADD COLUMN id INT AUTO_INCREMENT PRIMARY KEY")
(5)插入数据
mycursor = mydb.cursor()
sql = "INSERT INTO sites (name, url)
VALUES (%s, %s)"
val = ("RUNOOB", "https://www.runoob.com")
mycursor.execute(sql, val)mydb.commit() # 数据表内容有更新,必须使用到该语句print(mycursor.rowcount, "记录插入成功。")
select语句:查询数据使用SELECT语句;
where语句:读取指定条件的数据,可以使用where语句;
排序:查询结果排序可以使用 ORDER BY 语句,默认的排序方式为升序,关键字为 ASC,如果要设置降序排序,可以设置关键字 DESC。
delete删除记录:删除记录使用“DELETE FROM”语句。
update语句:数据表更新使用“UPDATE”语句。
drop删除表:删除表使用“DROP TABLE”语句。
2.4 python调用C语言
python中的ctypes模块提供了和C语言兼容的数据类型和函数来加载dll文件,因此调用时不需对源文件做任何修改。流程如下:
首先将C代码编译成动态.so文件(windows下为dll文件);
然后导入ctypes库from ctypes import *;
最后在python中直接调用adder = CDLL('./adder.so'),并且可以用adder对象调用动态文件中的函数。
这个过程中,C文件是自解释的,python通过导入模块加载库文件,在函数调用时,python内部会对C函数进行调用。
参考: