python是一种非常流行的脚本语言,而且功能非常强大,几乎可以做任何事情,比如爬虫、网络工具、科学计算、树莓派、web开发、游戏等各方面都可以派上用场。同时无论在哪种平台上,都可以用 python 进行系统编程。
机器学习可以用一些 python 库来实现,比如人工智能常用的tensorflow。也可以用像 nltk 这样的 python 库进行自然语言处理(nlp)。
本文讨论基本的 python 编程,后续会写一些 python 编程的实际案例。
操作字符串
python 中的字符串是不可变的,所以不能直接修改。对字符串内容的任何更改都需要产生新的副本。在 python 中处理字符串非常简单。
拼接字符串
1
2
|
str = "welcome " + "to python"
print ( str )
|
这是字符串连接,你也可以对字符串做乘法操作:
重复字符串
str = "python" * 2 print (str)
与非字符串拼接
可以用 str() 函数将非字符串的值转换为字符串,然后再连接,如下所示:
1
2
|
str = "this is test number " + str ( 15 )
print ( str )
|
搜索子字符串
可以使用 find() 方法搜索子字符串,如下所示:
1
2
|
str = "welcome to python"
print ( str .find( "python" ))
|
如果找到了字符串"python",则 find 方法会返回第一次出现这个字符串的位置。
如果没有找到,则返回 -1。
find 函数默认从第一个字符开始搜索,也可以从第n个字符开始,如下所示:
1
2
|
str = "welcome to python"
print ( str .find( "python" , 12 ))
|
因为我们从第12个字符开始,所以找不到 python 这个单词,所以它会返回 -1。
获取子字符串
所以我们得到了我们要搜索的字符串的索引,现在我们要打印匹配的字符串。
你可以按索输出印字符串,如下所示:
1
2
3
4
5
|
str = "first second third"
print ( str [: 2 ])
print ( str [ 2 :])
print ( str [ 3 : 5 ])
print ( str [ - 1 ])
|
在第 2 行的代码会打印第一个和第二个字符,而第 3 行会从第二个字符开始打印到结束。要注意代码中结冒号的位置。字符串从 0 开始计数。
如果使用负数,则会从最后开始计数。第 5 行代码会打印最后一个字符。
替换字符串
你可以用如下方法替换字符串:
1
2
3
|
str = "this website is about programming"
str2 = str .replace( "this" , "that" )
print (str2)
|
如果你想替换的字符串多次出现,但是只想替换第一次出现的,可以指定位置:
1
2
3
|
str = "this website is about programming i like this website"
str2 = str .replace( "website" , "page" , 1 )
print (str2)
|
第一个词只被替换了。
去除字符串两端的空格
可以用 strip 方法去掉字符串两端的空格,如下所示:
1
2
|
str = " this website is about programming "
print ( str .strip())
|
你可以用rstrip仅去除最右的空格,或者用 lstrip 去除最左边的空格。
改变字符大小写
在某些情况下你可能需要改变字符的大小写。
1
2
3
|
str = "welcome to likegeeks"
print ( str .upper())
print ( str .lower())
|
将字符串转换为数字
前面学到了用 str()函数将数字转为字符串,但这不是 python 中唯一的转换函数,另外还有 int() 、float()、long()和其他强制转换函数。
int() 可以把输入的字符串转为整数,float() 函数将字符串转为float。
1
2
3
4
|
str = "10"
str2 = "20"
print ( str + str2)
print ( int ( str ) + int (str2))
|
第 3 行只是连接两个字符串,而第 4 行把两个值相加并输出结果。
字符串计数
可以用min()找到字符串中 ascii 值最小的字符,max()找到最大的字符,用len()函数得到字符的总长度。
1
2
3
4
|
str = "welcome to python"
print ( min ( str ))
print ( max ( str ))
print ( len ( str ))
|
迭代字符串
可以用 for 迭代字符串并单独操作每个字符,如下所示:
1
2
3
|
str = "welcome to likegeeks website"
for i in range ( len ( str )):
print ( str [i])
|
其中 len() 函数用来得到字符串的长度。
字符串编码
如果你使用的是python 3,默认情况下所有字符都是 unicode 字符集编码,但是如果用的是python 2,可能需要对字符串进行编码,如下所示:
1
2
|
str = "welcome to python"
str .encode( 'utf-8' )
|
操作数字
在 python 中定义数字变量的方式如下:
a=15
可以定义整数,也可以定义浮点数。
浮点数可以用 int()函数进行舍入,如下所示:
1
2
|
a = 15.5
print ( int (a))
|
舍入数字
可以用 round() 函数对数字进行舍入:
1
2
|
a = 15.5652645
print ( round (a, 2 ))
|
只需指定需要舍入到小数点后几位。
自定义精度的数字
很多情况下会用到自定义精度的浮点数。
可以处理用户自定义精度数的 decimal 模块。
这样导入模块并使用:
1
2
3
|
from decimal import *
a = decimal( 5.5 )
|
生成随机数
python 中的 random 模块提供了生成随机数的函数。
1
2
3
|
import random
print (random.random())
|
生成的随机数介于 0.0 和 1.0 之间。
可以从自己定义的范围中生成一个随机数,如下所示:
1
2
3
4
|
import random
numbers = [ 1 , 2 , 3 , 4 , 5 , 6 , 7 ]
print (random.choices(numbers))
|
操作日期和时间
你可以从日期中提取所需的值,如下所示。
1
2
3
4
5
6
7
8
9
|
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())
|
可以得到两个时间或日期之间的差,如下所示:
1
2
3
4
5
6
|
import datetime
time1 = datetime.datetime.now()
time2 = datetime.datetime.now()
timediff = time2 - time1
print (timediff.microseconds())
|
上例中的 timediff 变量是 timedelta 类型的对象,你也可以自己创建这种对象:
1
2
3
4
|
time1 = datetime.datetime.now()
time2 = datetime.timedelta(days = 3 )
time3 = time1 + time2
print (time3.date())
|
格式化日期和时间
可以用 strftime() 格式化日期或时间。
下表指定了一些常用的格式选项:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
|
% 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 中处理文件非常容易,不管你信不信,在所欲语言中是是最简单的。当然你也可以说 python 是一种做什么事情都最简单的语言。
复制文件
shutil 模块中包含用于复制文件的功能。
1
2
|
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)
移动文件
你可以像这样移动一个文件:
1
2
|
import shutil
shutil.move( 'file1.txt' , 'file3.txt' )
|
也可以使用 os 模块中的 rename 函数重命名文件,如下所示:
1
2
|
import os
os.rename( 'file1.txt' , 'file3.txt' )
|
读写文本文件
可以用 open 函数打开文件,然后再用 read 或write 方法进行读写。
1
2
3
|
fd = open ( 'file1.txt' )
content = fd.read()
print (content)
|
首先,使用 open 函数打开文件并读取,然后我再用 read 函数读取文件内容,最后,将得到的内容放入变量 content 中。
你可以指定 read()()函数读取的字节数:
fd.read(20)
如果文件不是太大的话,你可以将整个内容读入一个列表,然后再遍历列表打印输出。
1
2
|
content = fd.readlines()
print (content[ 0 ])
|
可以通过指定打开的模式来写入文件。有两种写入模式,即写入模式和追加模式。
下面是写入模式,会覆盖掉文件中的旧内容。
1
2
|
fd = open ( 'file1.txt' , 'w' )
content = fd.write( 'your content goes here' )
|
下面是附加模式:
1
2
|
fd = open ( 'file1.txt' , 'a' )
content = fd.write( 'your content goes here' )
|
创建目录
可以用 os模块中的 mkdir 函数创建一个新目录,如下所示:
1
2
3
|
import os
os.mkdir('. / newfolder)
|
如果目录已经存在将会引发错误。不过不用担心,在以后的文章中会讨论异常处理,可以帮你避免此类错误。
获取访问和修改以及创建时间可以用 getmtime()、 getatime() 和 getctime() 分别获取修改时间、访问时间和创建时间。
返回的时间格式为 unix 时间戳,我们可以把它转换为人类可读的格式,如下所示:
1
2
3
4
5
|
import os
import datetime
tim = os.path.getctime( './file1.txt' )
print (datetime.datetime.fromtimestamp(tim))
|
迭代文件
你可以用 os 模块中的 listdir() 函数来获取文件:
1
2
3
4
|
import os
files = os.listdir( '.' )
print (files)
|
此外,你可以用 glob 模块执行相同的操作:
1
2
3
|
import glob
files = glob.glob( '*' )
print (files)
|
你可以为 glob()设定任何一种扩展名,例如设定为 * .doc 获取所有word文档。
序列化python对象
此过程用于将 python 对象序列化为字节流,以便以后重用。
你可以用 pickle 模块做到这一点:
1
2
3
4
|
import pickle
fd = open ( 'myfile.pk ' , 'wb' )
pickle.dump(mydata,fd)
|
可以用 load() 函数反序列化此数据,如下所示:
1
2
3
4
|
import pickle
fd = open ( 'myfile.pk ' , 'rb' )
mydata = pickle.load(fd)
|
压缩文件
python 标准库使你可以处理不同格式的压缩文件,如tar,zip,gzip,bzip2。
要处理 zip文件,你可以使用 zipfile模块:
1
2
3
4
|
import zipfile
my_zip = zipfile.zipfile( 'zipped_file.zip' , mode = 'r' )
print ( file .namelist())
|
你可以把一个文件压缩成 zip 格式,如下所示:
1
2
3
4
5
|
import zipfile
file = zipfile.zipfile( 'files.zip' , 'w' )
file .write( 'file1.txt' )
file .close()
|
可以用 extractall() 方法提取 zip 压缩包中的文件:
1
2
3
4
5
|
import zipfile
file = zipfile.zipfile( 'files.zip' , 'r' )
file .extractall()
file .close()
|
另外还可以用附加模式将文件附加到现有的zip文件,如下所示:
1
2
3
4
5
|
import zipfile
file = zipfile.zipfile( 'files.zip' , 'a' )
file .write( 'file2.txt' )
file .close()
|
在处理 gz 或 bz 文件时,可以用和上面相同的套路。不过要导入 gzip 模块或 bz2 模块。
1
2
3
4
5
|
import gzip
import bz2
gz_file = gzip.gzipfile( 'files.gz' , 'r' )
bz_file = bz2.bz2file( 'fiels.bz2' , 'r' )
|
然后用同样的方式读写。
你可以使用 unrar 包处理rar文件。首先,安装包:
pip install unrar
然后用同样的方式使用。
1
2
3
4
5
|
import unrar.rarfile
m = unrar.rarfile.rarfile( 'file.rar' )
m.namelist()
m.extractall()
|
解析csv文件
一个非常有用的包叫做 pandas。它可以解析 csv 和 excel 文件,并轻松地从中提取数据。
首先,安装包
pip install pandas
然后你可以在自己的代码中使用它,如下所示:
1
2
3
|
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 访问网络的方法,它支持许多网络协议。
1
2
3
4
|
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 字符,因为数据需要是字节字符串。
如果发送的数据太大,你应该通过循环分割并发送,如下所示:
1
2
3
4
5
6
|
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个字节。
如果消息很大,则必须反复循环,直到收到所有的数据块。
1
2
|
buffer = bytearray(b ' ' * 2000 )
m_sock.recv_into( buffer )
|
在这里定义了一个空缓冲区,然后将消息写入缓冲区。
从pop邮件服务器接收电子邮件 poplib 模块使你可以与 pop 服务器进行通信。
1
2
3
4
5
|
import getpass,poplib
pop_serv = poplib.pop3( '192.168.1.5' )
pop_serv.user( "myuser" )
pop_serv.pass_(getpass.getpass())
|
getpass 模块可以安全地处理密码。
如果需要安全连接,可以用 pop3_ssl 类。
要获取邮件列表和邮件计数,可以这样做:
1
2
|
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 邮件服务器通信。
1
2
3
4
|
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)')
最后,不要忘记关闭连接:
1
2
|
my_imap.close()
my_imap.logout()
|
发送电子邮件
想要通过 smtp 协议发送电子邮件。可以用 smtplib 。
1
2
3
4
|
import smtplib, getpass
my_smtp = smtplib.smtp(smtp.server.com')
my_smtp.login( "myuser" , getpass.getpass())
|
如果在 smtp服务器上使用ssl,则应用 smtp_ssl 类。
打开连接后,你可以这样发送邮件:
1
2
3
4
|
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 子模块。
1
2
3
4
|
import urllib.request
my_web = urllib.request.urlopen( 'https://www.google.com' )
print (my_web.read())
|
提交 web 表单
如果你想要提交 web 表单,应该向网页发送post请求。
1
2
3
4
5
|
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 类支持侦听连接请求。
1
2
3
4
5
6
7
|
import socket
host = ''
port = 3535
my_server = socket.socket(socket.af_inet, socket.sock_stream)
my_server.bind((host, port))
my_server.listen( 1 )
|
现在你可以接受这样的连接请求:
1
2
3
|
addr = my_server.accept()
print ( 'connected ... ' , addr)
data = conn.recv( 1024 )
|
最后不要忘记在操作完成后关闭连接
conn.close()
python 中的线程
并发运行任务是非常有用的,python 有一个名为 threading 的模块,它包含一个 thread 类。
1
2
3
4
5
|
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()方法检查它是否仍在运行。
有时你的线程需要安全地访问全局资源。这时候就需要用到锁。
1
2
3
4
5
6
7
8
9
10
11
|
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 总线上写输出:
1
2
3
4
|
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 接口读取数据,如下所示:
1
2
3
4
5
6
|
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 编程速成,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对服务器之家网站的支持!
如果你觉得本文对你有帮助,欢迎转载,烦请注明出处,谢谢!原文链接:https://segmentfault.com/a/1190000018849878