《菜鸟教程》之基础教程
一、基础教程
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()关闭套接字。
代码:socket编程
- python Internet模块:
协议 功能用处 端口号 Python 模块
HTTP 网页访问 80 httplib, urllib, xmlrpclib
NNTP 阅读和张贴新闻文章,俗称为"帖子" 119 nntplib
FTP 文件传输 20 ftplib, urllib
SMTP 发送邮件 25 smtplib
POP3 接收邮件 110 poplib
IMAP4 获取邮件 143 imaplib
Telnet 命令行 23 telnetlib
Gopher 信息查找 70 gopherlib, 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函数进行调用。
参考: