Python 编程速成:从基础语法到网络与硬件应用
本文提供 Python 编程速成指南,涵盖字符串操作、数字处理、日期时间、文件系统管理及序列化技术。深入讲解网络通信、邮件收发、网页抓取及多线程编程,并展示如何在树莓派上使用 GPIO 模块。适合希望快速掌握 Python 核心功能与实战应用的开发者。
Python 编程概述
Python 作为一种极具影响力的脚本语言,凭借其强大的功能几乎能胜任各类开发任务。无论是网络爬虫、系统工具、科学计算、Web 开发、游戏制作,还是树莓派等嵌入式设备的应用,Python 都能发挥重要作用。此外,它支持跨平台系统编程,具备极高的通用性。
在人工智能领域,Python 拥有 TensorFlow 等主流库支持机器学习;而在自然语言处理(NLP)方面,NLTK 等库提供了丰富的实现工具。
本文将重点介绍 Python 的基础编程知识,后续章节将结合具体案例进行深入探讨。
字符串操作基础
字符串操作
Python 中的字符串对象是不可变的,这意味着无法直接修改现有字符串的内容。任何对字符串的修改操作都会生成一个新的字符串副本。尽管有此限制,Python 提供了简洁高效的方法来处理字符串。
拼接字符串
str = "welcome " + "to Python"
print (str)
可以通过加号运算符实现字符串连接,同时 Python 支持对字符串执行乘法运算以实现重复效果。
重复字符串
str = "Python" * 2 print (str)
与非字符串拼接
若需将非字符串类型与字符串连接,可使用 str() 函数将其转换为字符串后再进行拼接,示例如下。
str = "This is test number " + str(15)
print (str)
搜索子字符串
利用 find() 方法可以查找子字符串在母字符串中的位置,具体用法见下例。
str = "welcome to Python"
print(str.find("Python"))
当字符串 "Python" 存在时,find 方法会返回其首次出现的索引位置。
若未找到目标子字符串,该方法将返回 -1。
find 函数默认从字符串起始位置开始搜索,但也可以指定从第 n 个字符开始搜索,如下所示。
str = "welcome to Python"
print(str.find("Python",12))
由于示例中从第 12 个字符开始搜索,而 "Python" 单词未出现在该位置之后,因此返回结果为 -1。
获取子字符串
在确定目标字符串的索引位置后,接下来需要提取并打印匹配的字符串内容。
可以通过索引方式输出字符串片段,具体操作如下。
str = "first second third"
print(str[:2])
print(str[2:])
print(str[3:5])
print(str[-1])
第 2 行代码输出前两个字符,第 3 行代码从第二个字符开始输出至末尾。请注意冒号在切片语法中的位置。Python 字符串索引从 0 开始计数。
使用负数索引时,计数方向从字符串末尾开始。第 5 行代码用于输出最后一个字符。
替换字符串
可以使用以下方法实现字符串替换。
str = "This website is about programming"
str2 = str.replace("This", "That")
print(str2)
若目标字符串多次出现,但仅希望替换第一次出现的情况,可以通过指定替换次数来实现。
str = "This website is about programming I like this website"
str2 = str.replace("website", "page",1)
print(str2)
此时,仅第一个匹配词被替换。
去除字符串两端的空格
使用 strip 方法可以移除字符串首尾的空格,示例如下。
str = " This website is about programming "
print(str.strip())
此外,还可以使用 rstrip 仅去除右侧空格,或使用 lstrip 仅去除左侧空格。
改变字符大小写
在某些应用场景下,可能需要调整字符串的大小写格式。
str="Welcome to likegeeks"
print(str.upper())
print(str.lower())
将字符串转换为数字
前文已介绍使用 str() 函数将数字转换为字符串,但 Python 还提供了其他类型转换函数,包括 int()、float()、long() 等强制转换工具。
int() 函数可将字符串转换为整数,float() 函数则将字符串转换为浮点数。
str="10"
str2="20"
print(str+str2)
print(int(str)+int(str2))
第 3 行代码仅执行字符串连接操作,而第 4 行代码将两个数值相加并输出结果。
字符串计数
可以使用 min() 查找 ASCII 值最小的字符,max() 查找最大的字符,并通过 len() 函数获取字符串的总长度。
str="welcome to Python"
print(min(str))
print(max(str))
print(len(str))
迭代字符串
可以使用 for 循环遍历字符串,从而单独处理每个字符,示例如下。
str="welcome to likegeeks website"
for i in range(len(str)):
print(str[i])
其中 len() 函数用于获取字符串的长度。
字符串编码
若使用 Python 3,默认情况下所有字符均使用 Unicode 编码集;但在 Python 2 中,可能需要显式对字符串进行编码,如下所示。
str="welcome to Python"
str.encode('utf-8')
数字与日期时间处理
操作数字
在 Python 中定义数字变量的方式如下。
a=15
可以定义整数类型,也可以定义浮点数类型。
浮点数可以通过 int() 函数进行舍入处理,示例如下。
a=15.5
print(int(a))
舍入数字
可以使用 round() 函数对数字进行舍入操作。
a=15.5652645
print(round(a,2))
只需指定需要保留的小数位数即可。
自定义精度的数字
在许多实际场景中,需要使用自定义精度的浮点数。
Python 提供了 decimal 模块来处理用户自定义精度的数值。
导入并使用该模块的方法如下。
from decimal import *
a=Decimal(5.5)
生成随机数
Python 的 random 模块提供了生成随机数的功能。
import random
print(random.random())
生成的随机数范围介于 0.0 和 1.0 之间。
可以从自定义的范围中生成随机数,示例如下。
import random
numbers=[1,2,3,4,5,6,7]
print(random.choices(numbers))
操作日期和时间
可以从日期对象中提取所需的特定值,如下所示。
import datetime
cur_date = datetime.datetime.now()
print(cur_date)
print(cur_date.year)
print(cur_date.day)
print(cur_date.weekday())
print(cur_date.month)
print(cur_date.time())
可以计算两个时间或日期之间的差值,示例如下。
import datetime
time1 = datetime.datetime.now()
time2 = datetime.datetime.now()
timediff = time2 - time1
print(timediff.microseconds())
上例中的 timediff 变量为 timedelta 类型的对象,也可以手动创建此类对象。
time1 = datetime.datetime.now()
time2 = datetime.timedelta(days=3)
time3=time1+time2
print(time3.date())
格式化日期和时间
可以使用 strftime() 函数对日期或时间进行格式化输出。
下表列出了一些常用的格式选项。
%y 两位数的年份表示(00-99)
%Y 四位数的年份表示(000-9999)
%m 月份(01-12)
%d 月内中的一天(0-31)
%H 24小时制小时数(0-23)
%I 12小时制小时数(01-12)
%M 分钟数(00=59)
%S 秒(00-59)
%a 本地简化星期名称
%A 本地完整星期名称
%b 本地简化的月份名称
%B 本地完整的月份名称
%c 本地相应的日期表示和时间表示
%j 年内的一天(001-366)
%p 本地A.M.或P.M.的等价符
%U 一年中的星期数(00-53)星期天为星期的开始
%w 星期(0-6),星期天为星期的开始
%W 一年中的星期数(00-53)星期一为星期的开始
%x 本地相应的日期表示
%X 本地相应的时间表示
%Z 当前时区的名称
%% %号本身
import datetime
date1 = datetime.datetime.now()
print(date1.strftime('%d. %B %Y %I:%M%p'))
从字符串创建日期
可以使用 strptime() 函数从字符串解析并创建日期对象,示例如下。
date1=datetime.datetime.strptime(“2015-11-21”, “%Y-%m-%d”)
也可以采用以下方式创建日期对象。
date1= datetime.datetime(year=2015, month=11, day=21)
文件系统与序列化
处理文件系统
在 Python 中处理文件非常简单,可以说它是处理文件系统最便捷的语言之一。
复制文件
shutil 模块包含了用于复制文件的功能。
import shutil
copied_path = shutil.copy('my_file.txt', 'copied_file.txt')
如果 my_file.txt 是一个软链接,上述代码会将 copied_file.txt 创建为独立的物理文件。
也可以创建软链接的副本,示例如下。
copied_path = shutil.copy('my_file.txt', 'copied_file.txt',follow_symlinks=False)
移动文件
可以使用以下方式移动文件。
import shutil
shutil.move('file1.txt', 'file3.txt')
也可以使用 os 模块中的 rename 函数重命名文件,示例如下。
import os
os.rename('file1.txt', 'file3.txt')
读写文本文件
可以使用 open 函数打开文件,随后通过 read 或 write 方法进行读写操作。
fd = open('file1.txt')
content = fd.read()
print(content)
首先,使用 open 函数打开文件并读取内容,接着使用 read 函数获取文件内容,最后将结果存入变量 content 中。
可以指定 read() 函数读取的字节数量。
fd.read(20)
若文件体积不大,可以将整个内容读入列表,然后遍历列表并打印输出。
content = fd.readlines()
print(content[0])
可以通过指定打开模式来写入文件。Python 提供两种写入模式:写入模式和追加模式。
以下是写入模式的示例,该模式会覆盖文件中的原有内容。
fd = open('file1.txt','w')
content = fd.write('YOUR CONTENT GOES HERE')
以下是追加模式的示例。
fd = open('file1.txt','a')
content = fd.write('YOUR CONTENT GOES HERE')
创建目录
可以使用 os 模块中的 mkdir 函数创建新目录,示例如下。
import os
os.mkdir('./NewFolder)
若目录已存在,执行该操作将引发错误。不过无需担心,后续文章将讨论异常处理机制,可帮助避免此类错误。
可以使用 getmtime()、getatime() 和 getctime() 分别获取文件的修改时间、访问时间和创建时间。
返回的时间格式为 Unix 时间戳,我们可以将其转换为人类可读的格式,如下所示。
import os
import datetime
tim=os.path.getctime('./file1.txt')
print(datetime.datetime.fromtimestamp(tim))
迭代文件
可以使用 os 模块中的 listdir() 函数获取目录下的文件列表。
import os
files = os.listdir('.')
print(files)
此外,还可以使用 glob 模块执行相同的操作。
import glob
files = glob.glob('*')
print(files)
可以为 glob() 函数设定特定的扩展名,例如设定为 *.doc 以获取所有 Word 文档。
序列化Python对象
此过程用于将 Python 对象序列化为字节流,以便后续重用。
可以使用 pickle 模块实现这一功能。
import pickle
fd = open('myfile.pk ', 'wb')
pickle.dump(mydata,fd)
可以使用 load() 函数反序列化数据,示例如下。
import pickle
fd = open('myfile.pk ', 'rb')
mydata = pickle.load(fd)
压缩文件
Python 标准库支持处理多种格式的压缩文件,包括 tar、zip、gzip 和 bzip2。
要处理 zip 文件,可以使用 zipfile 模块。
import zipfile
my_zip = zipfile.ZipFile('zipped_file.zip', mode='r')
print(file.namelist())
可以将文件压缩为 zip 格式,示例如下。
import zipfile
file=zipfile.ZipFile('files.zip','w')
file.write('file1.txt')
file.close()
可以使用 extractall() 方法从 zip 压缩包中提取文件。
import zipfile
file=zipfile.ZipFile('files.zip','r')
file.extractall()
file.close()
此外,还可以使用追加模式将文件添加到现有的 zip 文件中,示例如下。
import zipfile
file=zipfile.ZipFile('files.zip','a')
file.write('file2.txt')
file.close()
处理 gz 或 bz 文件时,可采用相同的方法,但需导入 gzip 模块或 bz2 模块。
import gzip
import bz2
gz_file=gzip.GzipFile('files.gz','r')
bz_file=bz2.BZ2File('fiels.bz2','r')
随后以相同的方式进行读写操作。
可以使用 unrar 包处理 rar 文件。首先,需要安装该包。
pip install unrar
安装后,即可按相同方式使用。
import unrar.rarfile
m=unrar.rarfile.RarFile('file.rar')
m.namelist()
m.extractall()
数据解析与网络通信
解析CSV文件
pandas 是一个非常实用的库,它可以解析 CSV 和 Excel 文件,并轻松提取数据。
首先,安装该包。
pip install pandas
随后即可在代码中使用,示例如下。
import pandas
data=pandas.read_csv('file.csv)
默认情况下,Pandas 将第一列视为每行的标签。若列索引并非第一列,可通过传递 index_col 参数来指定列索引。
若文档中不包含行标签,应使用参数 index_col = False。
要写入 CSV 文件,可以使用 to_csv() 方法。
data.to_csv('file.csv)
解析Excel文件
可以使用 pandas 模块中的 read_excel() 方法解析 Excel 文件。
data = pd.read_excel('file.xls', sheetname='Sheet1')
若文件中包含多个工作表,可以按以下方式加载。
ta = pd.ExcelFile('file.xls')
写入 Excel 文件的方式如下。
ta.to_excel('file.xls', sheet='Sheet1')
网络和连接
Python 提供了 socket 类,通过低级 API 支持多种网络协议的网络访问。
import socket
host = '192.168.1.5'
port = 5050
m_sock = socket.create_connection ((host, port))
此代码示例与 IP 地址为 192.168.1.5 的主机通过 5050 端口建立连接。
打开 socket 后,即可发送和接收数据。
m_sock.sendall(b'Hello World')
注意,在字符串前使用了 b 字符,因为数据需要以字节字符串形式传输。
若发送的数据量过大,应通过循环分割并分段发送,示例如下。
msg = b'Longer Message Goes Here'
mesglen = len(msg)
total = 0
while total < msglen:
sent = m_sock.send(msg[total:])
total = total + sent
接收数据时,需告知 recv() 方法每次读取的字节数。
data_in = m_sock.recv(2000)
此方法有效的前提是能够确定发送的消息长度小于 2000 个字节。
若消息体积较大,则必须反复循环,直到接收完所有数据块。
buffer = bytearray(b' ' * 2000)
m_sock.recv_into(buffer)
在此定义了一个空缓冲区,并将接收到的消息写入该缓冲区。
从 POP 邮件服务器接收电子邮件。poplib 模块允许与 POP 服务器进行通信。
import getpass,poplib
pop_serv = poplib.POP3('192.168.1.5')
pop_serv.user("myuser")
pop_serv.pass_(getpass.getpass())
getpass 模块可以安全地处理密码输入。
若需要安全连接,可以使用 POP3_SSL 类。
要获取邮件列表和邮件计数,可以按以下方式操作。
msg_list = pop_serv.list() # to list the messages
msg_count = pop_serv.msg_count() # to get message count
处理完毕后,务必记得关闭所有打开的连接。
pop_serv.quit()
从 IMAP 邮件服务器接收电子邮件
可以使用 imaplib 模块与 IMAP 邮件服务器进行通信。
import imaplib, getpass
my_imap = imaplib.IMAP4('imap.server.com')
my_imap.login("myuser", getpass.getpass())
若 IMAP 服务器使用 SSL,则应使用 IMAP4_SSL 类。
要获取电子邮件列表,需先执行查询操作。
data = my_imap.search(None, 'ALL')
随后,通过迭代 data 变量中的邮件索引来获取邮件内容。
msg = my_imap.fetch(email_id, '(RFC822)')
最后,不要忘记关闭连接。
my_imap.close()
my_imap.logout()
发送电子邮件
若要通过 SMTP 协议发送电子邮件,可以使用 smtplib。
import smtplib, getpass
my_smtp = smtplib.SMTP(smtp.server.com')
my_smtp.login("myuser", getpass.getpass())
若在 SMTP 服务器上使用 SSL,则应使用 SMTP_SSL 类。
打开连接后,可以按以下方式发送邮件。
from_addr = 'me@example.com'
to_addr = 'you@example.com'
msg = 'From: me@example.com\r\nTo: you@example.com\r\n\r\nHello, this is a test message'
my_smtp.sendmail(from_addr, to_addr, msg)
抓取网页
要与 Web 服务器通信,需使用 urllib.request 子模块。
import urllib.request
my_web = urllib.request.urlopen('https://www.google.com')
print(my_web.read())
提交 Web 表单
若需提交 Web 表单,应向网页发送 POST 请求。
import urllib.request
my_data = b'Your Data Goes Here'
my_req = urllib.request.Request('http://localhost', data=my_data,method='POST')
my_frm = urllib.request.urlopen(my_req)
print(my_frm.status)
此外,还可以使用 mechanize 或 urllib2 模块,实现此功能的方法还有很多。
创建一个微型服务器
socket 类支持监听连接请求。
import socket
host = ''
port = 3535
my_server = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
my_server.bind((host, port))
my_server.listen(1)
现在可以接受此类连接请求。
addr = my_server.accept()
print('Connected ... ', addr)
data = conn.recv(1024)
最后,务必在操作完成后关闭连接。
conn.close()
多线程与树莓派应用
Python 中的线程
并发运行任务非常实用,Python 提供了名为 threading 的模块,其中包含 Thread 类。
import threading
def print_message():
print('The message got printed from a different thread')
my_thread = threading.Thread(target=print_message)
my_thread.start()
若函数执行时间较长,可以使用 is_alive() 方法检查其是否仍在运行。
有时线程需要安全地访问全局资源,此时就需要使用锁机制。
import threading
num = 1
my_lock = threading.Lock()
def my_func():
global num, my_lock
my_lock.acquire()
sum = num + 1
print(sum)
my_lock.release()
my_thread = threading.Thread(target=my_func)
my_thread.start()
使用树莓派
树莓派是一种价格低廉的单板计算机,可用于开发各种有趣的应用。
可以使用 Python 的 RPi.GPIO 模块使树莓派与外接传感器进行通信。
首先,在树莓派中安装该包,如下所示。
$ sudo apt-get install python-dev python-rpi.gpio
随后即可在 Python 脚本中使用。可以在树莓派的 GPIO 总线上写入输出。
import RPi.GPIO as GPIO
GPIO.setmode(GPIO.BOARD)
GPIO.setup(1, GPIO.OUT, initial=GPIO.LOW)
GPIO.output(1, GPIO.HIGH)
通过树莓派的 GPIO 读取数据。可以使用 RPi.GPIO 模块从 GPIO 接口读取数据,示例如下。
import RPi.GPIO
RPi.GPIO.setup(1, GPIO.IN)
if RPi.GPIO.input(1):
print('Input was HIGH')
else:
print('Input was LOW')
以上仅展示了 Python 的一小部分基础知识,还有很长的路需要探索。
总结
以上介绍了 Python 编程速成教程,希望对大家有所帮助。如有任何疑问,请随时留言,小编会及时回复。感谢大家对本站的支持! 若本文对您有帮助,欢迎转载,烦请注明出处,谢谢!
免责声明:本文内容仅供参考,不代表本站观点。转载或引用请注明出处。









