翻译:疯狂的技术宅
https://likegeeks.com/python-...
本文首发微信公众号:前端先锋
欢迎关注,天天都给你推送新鲜的前端技术文章前端
Python是一种很是流行的脚本语言,并且功能很是强大,几乎能够作任何事情,好比爬虫、网络工具、科学计算、树莓派、Web开发、游戏等各方面均可以派上用场。同时不管在哪一种平台上,均可以用 Python 进行系统编程。python
机器学习能够用一些 Python 库来实现,好比人工智能经常使用的TensorFlow。也能够用像 NLTK 这样的 Python 库进行天然语言处理(NLP)。程序员
本文讨论基本的 Python 编程,后续会写一些 Python 编程的实际案例。web
Python 中的字符串是不可变的,因此不能直接修改。对字符串内容的任何更改都须要产生新的副本。
在 Python 中处理字符串很是简单。面试
str = "welcome " + "to Python" print (str)
这是字符串链接,你也能够对字符串作乘法操做:编程
str = "Python" * 2 print (str)
能够用 str()
函数将非字符串的值转换为字符串,而后再链接,以下所示:segmentfault
str = "This is test number " + str(15) print (str)
可使用 find()
方法搜索子字符串,以下所示:安全
str = "welcome to Python" print(str.find("Python"))
若是找到了字符串"Python",则 find
方法会返回第一次出现这个字符串的位置。bash
若是没有找到,则返回 -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 行会从第二个字符开始打印到结束。要注意代码中结冒号的位置。字符串从 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()
函数将字符串转为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))
只需指定须要舍入到小数点后几位。
不少状况下会用到自定义精度的浮点数。
能够处理用户自定义精度数的 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()
格式化日期或时间。
下表指定了一些经常使用的格式选项:
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
模块中包含用于复制文件的功能。
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])
能够经过指定打开的模式来写入文件。有两种写入模式,即写入模式和追加模式。
下面是写入模式,会覆盖掉文件中的旧内容。
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 对象序列化为字节流,以便之后重用。
你能够用 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()
一个很是有用的包叫作 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)
能够用 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)
在这里定义了一个空缓冲区,而后将消息写入缓冲区。
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()
能够用 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 表单,应该向网页发送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 有一个名为 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)
你能够用 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,还有不少内容须要介绍。未来会有更多的文章来帮助你们学习 Python 这种充满魅力的语言,请关注我。