Python3初步实践教程概要

“人生苦短,快学Python”
“Life is short, you need Python!”
———— Bruce Eckel

Python作为一门脚本语言,功能是非常强大的,同时也拥有很多模块库,进行适当的调用接口将给我们带来很多便利。Python运用的场景非常多,例如人工智能、云计算、Web开发、爬虫技术、数据分析等。大名鼎鼎的Youtube、Instagram、Reddit(大多都是国外的App,国内还是以Java Go为主)等App均使用Python进行快速开发。
当然,python作为脚本语言速度方面远远不如Java,甚至是C/C++,目前流行的开发也将此进行融合,取长补短合理利用。
对于网络专业、数据专业的同学来说Python技术是必不可少的,具体体现在对于爬虫分析(抓包分析)、数据分析、安全防范等。

前言

主要分为3个模块,分别是基础语法、编程初步、高级编程。对于最基本的Python格式不再编写,例如缩进、格式等问题。对于学习过数据结构的同学对于基础语法也是很快掠过,重点掌握list set dict的用法。对于学习过面向对象语言(例如C++/Java)在编程初步上也会很快学习。对于学习过前端(html+css+javascript)、计算机网络、数据库的同学可以进入高级教程,以便于快速学习。
总之,此初步实践仅对Python大致范围有个熟悉,后面将一些实战为例继续巩固Python学习。

基础语法

import导入 将整个模块导入:import somemodule 从模块中导入某个函数:from somemodule import firstfun,secondfunction ,导入全部函数:ftrom somemodule import *

基本数据类型

变量不需要声明,但是使用前必须赋值,赋值后才会被创建。变量没有类型
六大标准数据类型:type(a) instance(a,int?)
Number String List Tuple Set Dictionary
数值计算 :除法(/,得到一个浮点数) 除法( //,得到一个整数),乘方(),复数计算可以用a+bj 或者 complex(a,b)
String :使用‘’ 或者"" 使用’’ 下标索引从0开始,-1为末尾开始的位置,可以截取
List :数据类型可以不相同,写在[ ],input[-1::-1] 第一个参数表示最后一个元素,第二元素为空表示移动到末尾,第三个参数为步长,-1表示逆向
Tuple :与List类似不同在于元组元素不能修改并且写在()里面。
Set:集合,使用{} 或者set()创建集合

para={value1,value2}
or
set(value1,value2)

差 - 并 | 补 &
Dictionary:键(唯一)值对(无序),映射类型,使用{ }标识

dict={}
tintdict={'name':1,'runbane':2}

数据类型转换

函数描述
str(x)将对象x转换为字符串
tuple(),set(),dict(),llist()转换成对应类型
chr(x)将一个整数变成字符
ord(x)将一个字符转换为整数值
hex(x)将一个整数转换为16进制
ord(x)将一个整数转换为八进制

推导式

推导式是独特的数据处理方式,可以从一个数据序列构建另一个新的数据序列的结构体,支持各种数据结构的推导式:list dict set tuple
列表推导式

[表达式 for 变量 in 列表  (if) 条件]
>>> names = ['Bob','Tom','alice','Jerry','Wendy','Smith']
>>> new_names = [name.upper()for name in names if len(name)>3]
>>> print(new_names)
['ALICE', 'JERRY', 'WENDY', 'SMITH']

字典推导式

{key_expr: val_exp for value in collection if condition}
listdemo = ['Google','Runoob', 'Taobao']
# 将列表中各字符串值为键,各字符串的长度为值,组成键值对
>>> newdict = {key:len(key) for key in listdemo}
>>> newdict
{'Google': 6, 'Runoob': 6, 'Taobao': 6}

集合推导式

{express for item in Seque}
>>> setnew = {i**2 for i in (1,2,3)}
>>> setnew
{1, 4, 9}

运算符

逻辑运算符 and (与) or (或) not (非)
成员运算符 in not in (+序列)

a = 10
b = 20
list = [1, 2, 3, 4, 5 ]
if ( a in list ):
   print ("1 - 变量 a 在给定的列表中 list 中")
else:
   print ("1 - 变量 a 不在给定的列表中 list 中")

身份运算符 is not is (标识符) 例如 x is y 类似于 id(x) == id (y) 注意 id函数用于获取对象内存地址

数字Number

数据类型是不允许改变的,这就意味着如果改变数据类型的值,将重新分配内存。(必须先定义即赋予变量一个值)
随机数函数

函数描述
choice(seq)从序列的元素随机挑选一个数
uniform(x,y)范围[x,y]
random()随机生成一个实数,在[0,1)范围
seed([x])改变种子

字符串

单字符作为字符串,使用[]截取字符串,格式 变量 [头下标:尾下标]
以字符串Runoob为例:
从前面索引:0 1 2 3 4 5
从后面索引:-6 -5 -4 -3 -2 -1
从前面截取: : 1 2 3 4 5:
从后面截取: : -5 -4 -3 -2 -1:

字符串运算符 : [] 索引获取 ; [:] 截取字符串一部分 ,遵循左闭右开原则,例如[0:2]不包含第三个字符
格式化

print ("我叫 %s 今年 %d 岁!" % ('小明', 10))

内置函数

方法描述
capitalize()将第一个字符转换为大写
count(str,begin=0,end=len(string))返回str在string出现的次数
find(str,beg=0,end=len(string))检测str是否在字符串中
replace(old,new[,max])将old替换成new
split(str=“”,num=string.count(str))以str为分隔符

列表

访问和字符串一样,索引从0开始,也可以从尾部开始,最后一个索引为-1,依次-1.可以使用[]截取字符。list[0:4]将输出从0到3的字符。
更新列表:可直接对数据项进行修改或更新,同时也可以选择append()添加列表项
删除列表:del list[2]
列表比较:operator.eq(list1,list2)
函数:len(list),max(list),min(list),list(seq)

方法描述
list.append(obj)末尾添加新的对象
list.count(obj)统计某个元素在列表出现的次数
list.index(obj)找出某个值的索引位置
list.sort(key=Nooe,reverse=False)

元组

元组使用( ).记住元组是不可变的

字典

使用冒号进行分割,每个对之间使用逗号分隔,整个在{ }

str=input()
dir={}
for i in range(len(str)):
    if str[i] in dir:
        dir.update({str[i]:dir.get(str[i])+1})
    else :
        dir.update({str[i]:1})
print(dir)

集合

可以使用大括号或者set( )创建,注意创建一个空集合必须用set( )
集合基本操作:set.add(x) set.update(x) set.remove(x) set.discard(x)(删除指定元素)

编程初步

迭代器与生成器

迭代器是一个记住遍历位置的对象,从第一个元素开始知道被访问,并且只往前。
基本方法:iter(obj_name) 和 next(iter_name) 字符串、列表、元组都可以创建迭代器

class Exam:
    def __iter__(self):
        self.a=1
        return self
    def __next__(self):
        x=self.a
        self.a+=1
        return x

myc=Exam()
myiter=iter(myc)

print (next(myiter))
print (next(myiter))

生成器
使用了yeild函数被称为生成器(generator)生成器是一个返回迭代器的函数,只能用于迭代操作,更简单点理解生成器就是一个迭代器。
在调用生成器运行的过程中,每次遇到 yield 时函数会暂停并保存当前所有的运行信息,返回 yield 的值, 并在下一次执行 next() 方法时从当前位置继续运行。

函数

def max(a,b):
    return a
def 函数名(参数列表):
    函数体
 
if __name__=="__main__":
    

参数:必需参数 关键字参数 默认参数 不定长参数

匿名函数 lambda,所谓匿名就是不再使用def,只是一个表达式

lambda [arg1 [,arg2,.....argn]]:expression

x=lambda a : a+10
print(x(5))

数据结构

列表

方法描述
list.append(x)添加到列表的结尾
list.insert(i,x)在指定位置插入元素
list.remove(x)删除值为x的第一个元素
list.pop([i])从列表的指定位置删除元素
list.count(x)计数
list.sort()排序

使用列表可以作为一个堆栈来使用 append()入栈 pop()出栈
使用列表当作队列,append()入队 popleft()第一个出队

遍历技巧

遍历字典
>>> knights = {'gallahad': 'the pure', 'robin': 'the brave'}
>>> for k, v in knights.items():
...     print(k, v)


模块

模块就是一个python文件
import导包同Java,
from … import *

name属性:如果我们想在模块被引入时,模块中的某一程序块不执行,来使该程序块仅在该模块自身运行时执行。

if __name__ == '__main__':
   print('程序自身在运行')
else:
   print('我来自另一模块')

A.B :包A中的子模块B

输入和输出

输出:表达式 / print() / 文件的write()
str() :函数返回一个用户易读的表达形式
repr():产生一个解释器易读的表达形式
str.format()

print('{}1'.format('naio'))
print('{name}网址: {site}'.format(name='菜鸟教程', site='www.runoob.com'))

读取键盘输入
str=input()

读和写文件
open(filename,mode) mode:r,rb,r+,rb+,w,
f=open( ) str=f.read() f.close()
pickle模块实现了基本的数据序列和反序列化

import pickle

# 使用pickle模块将数据对象保存到文件
data1 = {'a': [1, 2.0, 3, 4+6j],
         'b': ('string', u'Unicode string'),
         'c': None}

selfref_list = [1, 2, 3]
selfref_list.append(selfref_list)

output = open('data.pkl', 'wb')

# Pickle dictionary using protocol 0.
pickle.dump(data1, output)

# Pickle the list using the highest protocol available.
pickle.dump(selfref_list, output, -1)

output.close()

File方法

open()方法:用于打开一个文件并返回文件对象,如果无法打开则抛出异常,使用完一定要调用close()

open(file,mode='r',encoding=None)

OS文件/目录

主要方法介绍:os模块

方法描述
os.chdir(path)改变当前工作目录
os.dup(fd)复制文件描述符
os.getcwd()返回当前工作目录
os.open(file,flags,[,mode])打开一个文件
os.read(fd,n)从文件描述符fd读取最多n个字节
>>> import os
>>> os.getcwd()      # 返回当前的工作目录
'C:\\Python34'
>>> os.chdir('/server/accesslogs')   # 修改当前的工作目录
>>> os.system('mkdir today')   # 执行系统命令 mkdir 

错误和异常

异常捕获使用try/except语句

while True:
    try:
        x = int(input("请输入一个数字: "))
        break
    except ValueError:
        print("您输入的不是数字,请再次尝试输入!")

在 try 语句中判断文件是否可以打开,如果打开文件时正常的没有发生异常则执行 else 部分的语句,读取文件内容(try/except…else)

try:
    runoob()
except AssertionError as error:
    print(error)
else:
    try:
        with open('file.log') as file:
            read_data = file.read()
    except FileNotFoundError as fnf_error:
        print(fnf_error)
finally:
    print('这句话,无论异常是否发生都会执行。')

触发异常使用raise

面向对象

类定义:

class ClassName:
    <statement-1>
    .
    .
    .
    <statement-N>

类对象支持:属性引用和实例化 ,引用: obj.name
类的构造方法:创建类的时候自动调用

def __init__(self):
    self.data = []
    
class Complex:
    def __init__(self, realpart, imagpart):
        self.r = realpart
        self.i = imagpart
x = Complex(3.0, -4.5)
print(x.r, x.i)   # 输出结果:3.0 -4.5

self代表类的实例 而非类,类的方法与普通函数只有一个区别,必须第一个参数是self

继承 :(派生类)

class DerivedClassName(BaseClassName):
    <statement-1>
    .
    .
    .
    <statement-N>

例子:

#类定义
class people:
    #定义基本属性
    name = ''
    age = 0
    #定义私有属性,私有属性在类外部无法直接进行访问
    __weight = 0
    #定义构造方法
    def __init__(self,n,a,w):
        self.name = n
        self.age = a
        self.__weight = w
    def speak(self):
        print("%s 说: 我 %d 岁。" %(self.name,self.age))
 
#单继承示例
class student(people):
    grade = ''
    def __init__(self,n,a,w,g):
        #调用父类的构函
        people.__init__(self,n,a,w)
        self.grade = g
    #覆写父类的方法
    def speak(self):
        print("%s 说: 我 %d 岁了,我在读 %d 年级"%(self.name,self.age,self.grade))
 
 
 
s = student('ken',10,60,3)
s.speak()

多继承 需要注意圆括号中父类的顺序,若是父类中有相同的方法名,而在子类使用时未指定,python从左至右搜索 即方法在子类中未找到时,从左到右查找父类中是否包含方法。

class DerivedClassName(Base1, Base2, Base3):
    <statement-1>
    .
    .
    .
    <statement-N>

方法重写 重载类似
类的私有属性:两个下划线开头 声明为私有(属性和方法)
运算符重载与类的专有方法 : init del repr len cmp call add sub mul pow mod truediv

命名空间和作用域

内置名称 全局名称 局部名称 Python 的查找顺序为:局部的命名空间去 -> 全局命名空间 -> 内置命名空间

a = 10
def test():
    global a
    a = a + 1
    print(a)
test()

标准库

命令行参数

>>> import sys
>>> print(sys.argv)
['demo.py', 'one', 'two', 'three']

高级教程

正则表达式

正则表达式是一个特殊的字符序列,能帮助检查字符串是否与模式匹配。re模块使其拥有全部的功能,compile函数根据一个模式字符串和可选标志参数生成一个正则表达式对象
简介
实例 1+abc$
^为匹配输入字符串开始的位置;[0-9]+ 匹配多个数字,[0-9]匹配单个数字 。abc 匹 配 字 母 a b c 并 以 a b c 结 尾 , 匹配字母abc并以abc结尾, abcabc为匹配输入字符串的结束位置。

可选标志(flags):

修饰符描述
re.l使匹配对大小不敏感
re.L做本地化识别(locale-aware)匹配
re.M多行匹配
re.S使匹配包括换行在内的所有字符
re.U根据Unicode 解析字符
re.X给予灵活的格式

re.match(pattern,string,flags=0) 参数说明:1.匹配的正则表达式 2.要匹配的字符串 3.标识位 尝试从字符串起始位置匹配一个模式,如果不是起始位置匹配成功的话就返回none
可以使用group(num)或者groups()匹配对象函数来获取匹配表达式:group(num=0):

import re
print(re.match('www', 'www.runoob.com').span())  # 在起始位置匹配 输出 (0,3)
print(re.match('com', 'www.runoob.com'))         # 不在起始位置匹配  输出 None
 
实例二:
import re
line = "Cats are smarter than dogs"
# .* 表示任意匹配除换行符(\n、\r)之外的任何单个或多个字符
# (.*?) 表示"非贪婪"模式,只保存第一个匹配到的子串
matchObj = re.match( r'(.*) are (.*?) .*', line, re.M|re.I)
if matchObj:
   print ("matchObj.group() : ", matchObj.group())
   print ("matchObj.group(1) : ", matchObj.group(1))
   print ("matchObj.group(2) : ", matchObj.group(2))
else:
   print ("No match!!")

re.search(pattern,string,flags=0) :扫描整个字符串并返回第一个成功的匹配。与match区别是match只匹配字符串的开始。

re.sub(pattern,repl,string,count=0,flags=0)

  • pattern : 正则中的模式字符串。
  • repl : 替换的字符串,也可为一个函数。
  • string : 要被查找替换的原始字符串。
  • count : 模式匹配后替换的最大次数,默认 0 表示替换所有的匹配。
  • flags : 编译时用的匹配模式,数字形式

关于更多关于正则表达式符号内容请参考:https://www.runoob.com/python3/python3-reg-expressions.html#flags

CGI编程

CGI:通用网关接口,运行在服务器上,因为过时不再进行讲解。(后续填坑)

Mysql

下载链接 推荐使用PyMySQL(后面安装方法)

pip install mysql-connector-python -i https://pypi.tuna.tsinghua.edu.cn/simple

连接数据库

import mysql.connector
 
mydb = mysql.connector.connect(
  host="localhost",
  user="root",
  passwd="123456",
  database="runoob_db"
)
mycursor = mydb.cursor()

插入数据

sql='insert into pythontest values(%s,%s)'
val=('123','mytest')
mycursor.execute(sql,val)
mydb.commit() #更新数据库必须要加的
print('suss')

查询数据

sql='select * from stud'
mycursor.execute(sql)
myresul=mycursor.fetchall() #获取所有记录
for x in myresul:
    print(x)

如果只要读取一条数据,可以使用fetchone()方法
其余的都是数据库基本功了。

删除数据

sql = "DELETE FROM sites WHERE name = 'stackoverflow'"
mycursor.execute(sql)
mycursor.execute(sql)
# 为了防止发生sql注入的攻击,可以使用%s占位符来转义删除语句的条件
sql = "DELETE FROM sites WHERE name = %s"
na = ("stackoverflow", )
mycursor.execute(sql, na)

可以使用PyMySQL进行数据库连接,PyMySQL 是在 Python3.x 版本中用于连接 MySQL 服务器的一个库

pip3 install PyMySQL -i https://pypi.tuna.tsinghua.edu.cn/simple

网络编程

两个级别的网络服务:1.低级别网络服务支持基本的Socket (套接字) 2.高级别的网络服务模块SocketServer 提供了服务器中心类

socket.socket([family[,type[,proto]]])

# family:套接字家族可以是AF_UNIX或者AF_INET
# type:面向连接还是非连接
# protocol:一般不填默认为0

Socket对象(内建)方法:

函数描述
服务器端套接字
s.bind()绑定地址(host,port)
s.listen()开始TCP监听
s.accept()被动接受TCP客户端连接
客户端套接字
s.connect()主动初始化TCP服务器连接
s.close()关闭套接字
#服务端
import sys
import socket

server=socket.socket(socket.AF_INET,socket.SOCK_STREAM)
host=socket.gethostname()
port=9999
server.bind((host,port))
server.listen(5)

while True:
    clients,add=server.accept()
    print('连接地址:%s'%str(add))
    msg='welcom'+'\r\n'
    clients.send(msg.encode('utf-8'))
    clients.close()
 

#客户端
import imp
import socket
import sys

s=socket.socket(socket.AF_INET,socket.SOCK_STREAM)
host=socket.gethostname()
port=9999
s.connect((host,port))
msg=s.recv(1024)
s.close()
print(msg.decode('utf-8'))
协议功能用处端口号Python 模块
HTTP网页访问80httplib, urllib, xmlrpclib
NNTP阅读和张贴新闻文章,俗称为"帖子"119nntplib
FTP文件传输20ftplib, urllib
SMTP发送邮件25smtplib
POP3接收邮件110poplib
IMAP4获取邮件143imaplib
Telnet命令行23telnetlib
Gopher信息查找70gopherlib, urllib

SMTP发送邮件

import smtplib
smtpo=smtplib.SMTP([host[,port[,local_host_name]]])

# host SMTP服务器主机
# port 一般情况下SMTP端口号为25
# local_hostname:如果SMTP在本机上只需要指定服务器为localhost即可

# 发送邮件
SMTP.sendmail(from_addr,to_addr,msg[,mail_options,rcpt_options])

一个完整的从qq邮箱发送的例子,注意邮箱要开启SMTP服务,密码是对应的授权码

import smtplib 
from email.mime.text import MIMEText
from email.header import Header
#引入smtplib、MIMETex和Header

mailhost='smtp.qq.com'
#把qq邮箱的服务器地址赋值到变量mailhost上,地址应为字符串格式
qqmail = smtplib.SMTP()
#实例化一个smtplib模块里的SMTP类的对象,这样就可以调用SMTP对象的方法和属性了
qqmail.connect(mailhost,587)
#连接服务器,第一个参数是服务器地址,第二个参数是SMTP端口号。
#以上,皆为连接服务器。

account = input('请输入你的邮箱:')
#获取邮箱账号,为字符串格式
password = input('请输入你的密码:')
#获取邮箱密码,为字符串格式
qqmail.login(account,password)
#登录邮箱,第一个参数为邮箱账号,第二个参数为邮箱密码
#以上,皆为登录邮箱。

receiver=input('请输入收件人的邮箱:')
#获取收件人的邮箱。

content=input('请输入邮件正文:')
#输入你的邮件正文,为字符串格式
message = MIMEText(content, 'plain', 'utf-8')
#实例化一个MIMEText邮件对象,该对象需要写进三个参数,分别是邮件正文,文本格式和编码
subject = input('请输入你的邮件主题:')
#输入你的邮件主题,为字符串格式
message['Subject'] = Header(subject, 'utf-8')
#在等号的右边是实例化了一个Header邮件头对象,该对象需要写入两个参数,分别是邮件主题和编码,然后赋值给等号左边的变量message['Subject']。
#以上,为填写主题和正文。

try:
    qqmail.sendmail(account, receiver, message.as_string())
    print ('邮件发送成功')
except:
    print ('邮件发送失败')
qqmail.quit()
#以上为发送邮件和退出邮箱。

# 协议  服务器         SSL   非 SSL
# SMTP smtp.163.com   465   25
# IMAP imap.163.com   993   143
# POP3 pop.163.com    995   110
# -------------------------------
# SMTP smtp.qq.com    465/587
# IMAP imap.qq.com    993
# POP3 pop.qq.com     995
# -------------------------------
# SMTP smtp.gmail.com 465(SSL)/587(TLS/STARTTLS)
# IMAP imap.gmail.com 993
# POP3 pop.gmail.com  995
# -------------------------------
# 163/qq: password 为授权码
# gmail: password 为邮箱密码

多线程

线程分为:内核线程(操作系统) 用户线程
使用的模块:_thread threading (推荐)

_thread.start_new_thread(function,args[,kwargs])
# function -线程函数
# args -传递给线程函数的参数
# kwargs -可选参数
import _thread
import time

def print_time(threadName,delay):
    count=0
    while count<5:
        time.sleep(delay)
        count+=1
        print('%s:%s'%(threadName,time.ctime(time.time())))
        
# 2个线程
if __name__=='__main__':
    try:
        _thread.start_new_thread(print_time,('Thread-1',2,))
        _thread.start_new_thread( print_time, ("Thread-2", 4, ) )
    except:
        print('Error')
    while 1:
        pass    

Thread类方法名类似于Java,下面写一个程序继承Thread类

import threading
import time

exitFlag = 0

class myThread (threading.Thread):
    def __init__(self, threadID, name, delay):
        threading.Thread.__init__(self)
        self.threadID = threadID
        self.name = name
        self.delay = delay
    def run(self):
        print ("开始线程:" + self.name)
        print_time(self.name, self.delay, 5)
        print ("退出线程:" + self.name)

def print_time(threadName, delay, counter):
    while counter:
        if exitFlag:
            threadName.exit()
        time.sleep(delay)
        print ("%s: %s" % (threadName, time.ctime(time.time())))
        counter -= 1

# 创建新线程
thread1 = myThread(1, "Thread-1", 1)
thread2 = myThread(2, "Thread-2", 2)

# 开启新线程
thread1.start()
thread2.start()
thread1.join()
thread2.join()
print ("退出主线程")

线程同步

使用 Thread 对象的 Lock 和 Rlock 可以实现简单的线程同步,这两个对象都有 acquire 方法和 release 方法,对于那些需要每次只允许一个线程操作的数据,可以将其操作放到 acquire 和 release 方法之间。

import threading
import time

class myThread (threading.Thread):
    def __init__(self, threadID, name, delay):
        threading.Thread.__init__(self)
        self.threadID = threadID
        self.name = name
        self.delay = delay
    def run(self):
        print ("开启线程: " + self.name)
        # 获取锁,用于线程同步
        threadLock.acquire()
        print_time(self.name, self.delay, 3)
        # 释放锁,开启下一个线程
        threadLock.release()

def print_time(threadName, delay, counter):
    while counter:
        time.sleep(delay)
        print ("%s: %s" % (threadName, time.ctime(time.time())))
        counter -= 1

threadLock = threading.Lock()
threads = []

# 创建新线程
thread1 = myThread(1, "Thread-1", 1)
thread2 = myThread(2, "Thread-2", 2)

# 开启新线程
thread1.start()
thread2.start()

# 添加线程到线程列表
threads.append(thread1)
threads.append(thread2)

# 等待所有线程完成
for t in threads:
    t.join()
print ("退出主线程")

JSON数据解析

简单介绍JSON语法基本内容:(是JavaScript对象表示语法的子集):数据在名称/值对中;数据由逗号分隔 ;大括号{}保存对象 ;中括号[]保存数组

-- 键值对
{ "name":"菜鸟教程" , "url":"www.runoob.com" }
-- 数组
{
    "sites": [
        { "name":"菜鸟教程" , "url":"www.runoob.com" }, 
        { "name":"google" , "url":"www.google.com" }, 
        { "name":"微博" , "url":"www.weibo.com" }
    ]
}

--使用JavaScript语法
var sites = [
    { "name":"runoob" , "url":"www.runoob.com" }, 
    { "name":"google" , "url":"www.google.com" }, 
    { "name":"微博" , "url":"www.weibo.com" }
];
sites[0].name -- 访问第一项数据 将返回runoob

-- JSON.parse(): 将一个 JSON 字符串转换为 JavaScript 对象。
-- JSON.stringify(): 于将 JavaScript 值转换为 JSON 字符串。

使用json模块对JSON数据进行编解码,包含2个函数: json.dumps() 编码 ;json,loads() 解码

PythonJSON
dictobject
list, tuplearray
strstring
int, float, int- & float-derived Enumsnumber
Truetrue
Falsefalse
Nonenull

实例演示了 Python 数据结构转换为JSON:

import json

data={
    'name':'run',
    'url':'www.baidu.com'
}

json_str=json.dumps(data)
print ( json_str)

#处理文件的程序
# 写入 JSON 数据
with open('data.json', 'w') as f:
    json.dump(data, f)
 
# 读取数据
with open('data.json', 'r') as f:
    data = json.load(f)

日期和时间

每个时间戳都以自从 1970 年 1 月 1 日午夜(历元)经过了多长时间来表示。

import time  # 引入time模块

ticks = time.time()
print ("当前时间戳为:", ticks)

用一个元组装起来的9组数字处理时间
struct_time元组:属性tm_year tm_mon tm_mday tm_yday(一年第几天) tm_wday(0到6)

import time

localtime=time.localtime(time.time()) # 元组时间
localtime=time.asctime(time.localtime(time.time())) # 获取格式化的时间
print (time.strftime("%Y-%m-%d %H:%M:%S", time.localtime())) # 格式化日期
# %y 两位数的年份  %Y 四位数的年份 %m 月份  %d 月内中的一天  %H 24小时数 

获取某月日历
Calendar模块

import calendar

cal = calendar.month(2016, 1)
print ("以下输出2016年1月份的日历:")
print (cal)  # 将输出日历

urllib

urllib库用于操作网页URL,并对网页的内容进行抓取处理。
urllib.request

urllib.request.urlopen(url, data=None, [timeout, ]*, cafile=None, capath=None, cadefault=False, context=None)

# url:地址
# data 发送到服务器的其他数据对象 默认为None
# cafile :CA证书
# context:ssl.SSLContext类型
form urllib.request import urlopen

myurl=urlopen('www.baidu.com')
print(myurl.read())

# 使用read函数获取HTML实体代码

判断网页是否可以正常访问:
使用getcode()获取网页状态码,返回200正常,404就说明不存在

import urllib.request

myURL1 = urllib.request.urlopen("https://www.runoob.com/")
print(myURL1.getcode())   # 200

try:
    myURL2 = urllib.request.urlopen("https://www.runoob.com/no.html")
except urllib.error.HTTPError as e:
    if e.code == 404:
        print(404)   # 404

pip

pip是python包管理工具,提供了对包的查找、下载、安装、卸载的功能
注意python 2.7.9+或python 3.4+都自带了pip
pip 注意在cmd终端运行

pip --version #查看版本
pip install some_package # 下载包
pip uninstall some_package  #卸载
pip list # 查看已经安装的软件包
python3 -m pip install XXX # 如果python3 和python2同时有需要加上标注

pip 换源
一般使用普通的下载会很慢,原因在于服务器不再国内,需要加上镜像网站

pip install package -i https://pypi.tuna.tsinghua.edu.cn/simple # -i 清华大学
# https://pypi.mirrors.ustc.edu.cn/simple/ 中科大
# https://pypi.doubanio.com/simple/ 豆瓣

  1. 0-9 ↩︎

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值