【云驻共创】你知道在未来Python主要的运用途径和领域吗?
为什么这么多人在学Python呢?很多小白都听说Python很火,简单易学,学起来很容易,学习周期短,可是为啥要学Python呢?,下面谈谈我对Python的感悟。
在PC时代大量的嵌入式的设备,底层的代码,底层原理,以及底层逻辑运用,以及桌面的应用都是用C、C++实现的,毋庸置疑它们是最接近底层,对底层有着强大的解释说服力,也是最早的、最快的。随着2000年电商的大规模的兴起,多数人融入到这个大家庭中,逐渐地从PC时代过度到互联网时代,Java开始王者归来,再加上2010移动互联网的爆发Android开始风靡起来,Java更是如日中天,走向了辉煌。那我们现在为什么要学习Python呢?Python到底是用来干什么的?
Python的用途
1、Web开发
Python的诞生历史比Web还要早,由于Python是一种解释型的脚本语言,开发效率高,所以非常适合用来做Web开发,大大提高了做web开发人员的效率。
Python有上百种Web开发框架,有很多成熟的模板技术,选择Python开发Web应用,不但开发效率高,而且运行速度快,加快了时代的发展。
常用的web开发框架有:Django、Flask、Tornado 等。
许多知名的互联网企业或者小型公司将Python作为主要开发语言:豆瓣、知乎、果壳网、Google、NASA、YouTube、Facebook……
由于后台服务器的通用性,除了狭义的网站之外,很多App和游戏的服务器端也同样用 Python实现,来运行,完成相应的工作。
一个Web应用的本质就是:
- 浏览器发送一个HTTP请求;
- 服务器收到请求,生成一个HTML文档;
- 服务器把HTML文档作为HTTP响应的Body发送给浏览器;
- 浏览器收到HTTP响应,从HTTP Body取出HTML文档并显示。
所以,最简单的Web应用就是先把HTML用文件保存好,用一个现成的HTTP服务器软件,接收用户请求,从文件中读取HTML,返回。Apache、Nginx、Lighttpd等这些常见的静态服务器就是干这件事情的,完成这些事情的。
如果要动态生成HTML,就需要把上述步骤自己来实现。不过,接受HTTP请求、解析HTTP请求、发送HTTP响应都是苦力活,如果我们自己来写这些底层代码,还没开始写动态HTML呢,就得花个把月去读HTTP规范。
正确的做法是底层代码由专门的服务器软件实现,我们用Python专注于生成HTML文档。因为我们不希望接触到TCP连接、HTTP原始请求和响应格式,所以,需要一个统一的接口,让我们专心用Python编写Web业务。
这个接口就是WSGI:Web Server Gateway Interface。(Web服务器网关接口)
wsgi就是一种规范,它定义了使用web应用程序与Python编写的web服务器程序之间的接口格式。无论多么复杂的Web应用程序,入口都是一个WSGI处理函数。HTTP请求的所有输入信息都可以通过environ获得,HTTP响应的输出都可以通过start_response()加上函数返回值作为Body。
WSGI接口定义非常简单,它只要求Web开发者实现一个函数,就可以响应HTTP请求。我们来看一个最简单的Web版本的“Hello,web!”:
def application(environ, start_response):
start_response('200 OK', [('Content-Type', 'text/html')])
return '<h1>Hello, web!</h1>'
上面的application()
函数就是符合WSGI标准的一个HTTP处理函数,它接收两个参数:
- environ:一个包含所有HTTP请求信息的
dict
对象; - start_response:一个发送HTTP响应的函数。
在application()
函数中,调用:
start_response('200 OK', [('Content-Type', 'text/html')])
就发送了HTTP响应的Header,注意Header只能发送一次,也就是只能调用一次start_response()
函数。start_response()
函数接收两个参数,一个是HTTP响应码,一个是一组list
表示的HTTP Header,每个Header用一个包含两个str
的tuple
表示。
通常情况下,都应该把Content-Type
头发送给浏览器。其他很多常用的HTTP Header也应该发送。
然后,函数的返回值'<h1>Hello, web!</h1>'
将作为HTTP响应的Body发送给浏览器。
有了WSGI,我们关心的就是如何从environ
这个dict
对象拿到HTTP请求信息,然后构造HTML,通过start_response()
发送Header,最后返回Body。
了解了WSGI框架,我们发现:其实一个Web App,就是写一个WSGI的处理函数,针对每个HTTP请求进行响应。
但是如何处理HTTP请求不是问题,问题是如何处理100个不同的URL。
由于用Python开发一个Web框架十分容易,所以Python有上百个开源的Web框架。各种Web框架的优缺点自己去了解一下就可以了,直接选择一个比较流行的Web框架——Flask来使用。
除了Flask,常见的Python Web框架还有:
- Django:全能型Web框架;
- web.py:一个小巧的Web框架;
- Bottle:和Flask类似的Web框架;
- Tornado:Facebook的开源异步Web框架。
做一个游戏
import turtle as t
# 2. 创建背景
game = t.Screen()
game.title("打乒乓")
game.bgcolor("black")
game.setup(800, 600)
game.tracer(0)
# 3. 创建球拍
xm = t.Turtle()
xm.ht() # 先隐藏
xm.up()
xm.speed(0)
xm.color('yellow')
xm.shape('square')
xm.shapesize(5, 1)
xm.goto(-350, 0)
xm.st() # 再显示
# 5. 创建如花
ruhua = t.Turtle()
ruhua.ht() # 先隐藏
ruhua.up()
ruhua.speed(0)
ruhua.color('white')
ruhua.shape('square')
ruhua.shapesize(5, 1)
ruhua.goto(350, 0)
ruhua.st() # 再显示
# 6. 创建乒乓球
pp = t.Turtle()
pp.up()
pp.speed(0)
pp.color('white')
pp.shape('circle')
pp.st() # 再显示
pp.dx = 2
pp.dy = 2
player_speed = 10
xm_score = 0
ruhua_score = 0
def write_score():
pen.clear()
score_text = "小明:{} 如花:{}".format(xm_score, ruhua_score)
pen.write(score_text, align="center", font=("Arial", 20, 'bold'))
pen = t.Turtle()
pen.ht()
pen.up()
pen.color('white')
pen.goto(-30, 250)
write_score()
def xm_up():
y = xm.ycor()
y = y + player_speed
xm.sety(y)
def xm_down():
y = xm.ycor()
y = y - player_speed
xm.sety(y)
def ruhua_up():
y = ruhua.ycor()
y = y + player_speed
ruhua.sety(y)
def ruhua_down():
y = ruhua.ycor()
y = y - player_speed
ruhua.sety(y)
game.listen()
game.onkey(xm_up, 's')
game.onkey(xm_down, 'x')
game.onkey(ruhua_up, 'Up')
game.onkey(ruhua_down, 'Down')
# 判定是否要退出
running = True
def stop_loop():
global running
running = False
# 获得窗口的Tk对象,并注册关闭事件
root = game.getcanvas().winfo_toplevel()
root.protocol('WM_DELETE_WINDOW', stop_loop)
# 主循环
while running:
game.update()
pp.setx(pp.xcor() + pp.dx)
pp.sety(pp.ycor() + pp.dy)
if (pp.ycor() > 290) or (pp.ycor() < -290):
pp.dy *= -1
# 9 接球
y_up = ruhua.ycor() + 50
y_down = ruhua.ycor() - 50
if (pp.ycor() < y_up and pp.ycor() > y_down and pp.xcor() > 340):
pp.dx *= -1
pp.setx(339)
if (pp.ycor() < xm.ycor() + 50 and pp.ycor() > xm.ycor() - 50 and pp.xcor() < -340):
pp.dx *= -1
pp.setx(-339)
# 10 球出界
if (pp.xcor() > 380):
pp.goto(0, 0)
xm_score += 1
print("小明得分!")
write_score()
if (pp.xcor() < -380):
pp.goto(0, 0)
ruhua_score += 1
print("如花得分!")
write_score()
# game.mainloop()
2、网络爬虫
许多人对编程的热情始于好奇,终于停滞,小有成就就止步于此。
距离真枪实干做开发有技术差距,也无人指点提带,也不知当下水平能干嘛?就在这样的疑惑循环中,编程技能止步不前,而爬虫是最好的进阶方向之一。
网络爬虫是Python比较常用的一个场景,国际上,google在早期大量地使用Python语言作为网络爬虫的基础,带动了整个Python语言的应用发展。以前国内很多人用采集器搜刮网上的内容,现在用Python收集网上的信息比以前容易很多了,如:
从各大网站爬取商品折扣信息,比较获取最优选择;
对社交网络上发言进行收集分类,生成情绪地图,分析语言习惯;
爬取网易云音乐某一类歌曲的所有评论,生成词云;
按条件筛选获得豆瓣的电影书籍信息并生成表格……
应用实在太多,几乎每个人学习爬虫之后都能够通过爬虫去做一些好玩有趣有用的事。
例子:爬取网络上的歌曲
import urllib.request
import sys
import re
import os
w = 0
wt = 0
class Dowsong(): # 下载歌曲
def __init__(self, songid):
self.songid = songid
"""获取歌名"""
name = urllib.request.urlopen('https://music.163.com/song?id=' + self.songid).read().decode() # 获取源码
name = re.compile('"title": "' + "(.*?)" + '",', re.S).findall(name) # 获取歌名
print('正在下载' + name[0])
if os.path.exists(f + '/' + name[0] + '.mp3') == True: # 判断该文件是否存在,如果存在就删除
os.remove(f + '/' + name[0] + '.mp3')
dow = 'http://music.163.com/song/media/outer/url?id=' + self.songid + '.mp3' # 下载api
urllib.request.urlretrieve(dow, f + '/' + name[0] + '.mp3') # 下载
kb = ((os.path.getsize(f + '/' + name[0] + '.mp3')) / 1000) # 计算大小
if (kb) < 100: # 判断是否下载成功
print(name[0] + '下载失败')
os.remove(f + '/' + name[0] + '.mp3')
w = +1
else:
print(name[0] + '下载成功' + '文件大小为' + str(kb) + 'kb')
wt = +1
i = input('请输入歌曲连接或歌单连接')
# 类型判断
t = ''
d = ''
try: # 判断是否包含song
a = re.search('song', i).span()
except:
t = '0'
else:
d = 'song'
print('你输入的可能为歌曲')
if t == '0':
try:
a = re.search('playlist', i).span() # 判断是否包含playlist
except:
print('你输入的可能不是歌曲或者歌单的连接')
sys.exit()
else:
d = 'playlist'
print('你输入的可能是歌单')
i = i.split('id=') # 截取id
i = i[1]
i = i.replace('&user', '', )
f = input('请输入要保存到的文件目录:')
try:
os.makedirs(f) # 如果目录不存在那就创建个
except:
pass
print(i)
# 处理歌曲
if d == 'song':
Dowsong(i)
# 处理歌单、
if d == 'playlist':
url = 'https://music.163.com/playlist?id=' + i
url = urllib.request.urlopen(url).read().decode() # 获取歌单源码
names = re.compile('"title": "' + "(.*?)" + '",', re.S).findall(url) # 取歌单名
print('当前歌单名:' + names[0])
url = re.compile(
'<span class="f-ff2">歌曲列表</span>' + "(.*?)" + '<textarea id="song-list-pre-data" style="display:none;">',
re.S).findall(url) # 截取中间信息
url = url[0]
url = re.compile('<li><a href="/song' + "(.*?)" + '">', re.S).findall(url) # 获取歌曲id
print('获取到' + str(len(url)) + '个音乐id信息')
f = f + '/' + names[0] # 以歌单名,创建文件目录
try:
os.makedirs(f)
except:
pass
for urls in url:
urls = urls.replace('?id=', '', )
Dowsong(urls)
print('下载成功' + str(wt) + '个' + '\n' + '下
载失败' + str(w))
3、人工智能
人工智能是现在非常火的一个方向,AI热潮让Python语言的未来充满了无限的潜力。现在释放出来的几个非常有影响力的AI框架,大多是Python的实现,为什么呢?
因为Python有很多库很方便做人工智能,比如numpy, scipy做数值计算的,sklearn做机器学习的,pybrain做神经网络的,matplotlib将数据可视化的。在人工智能大范畴领域内的数据挖掘、机器学习、神经网络、深度学习等方面都是主流的编程语言,得到广泛的支持和应用。
人工智能的核心算法大部分还是依赖于C/C++的,因为是计算密集型,需要非常精细的优化,还需要GPU、专用硬件之类的接口,这些都只有C/C++能做到,所有c/c++和P相结合就可以实现人工智能。
4、Python的其他应用举例
系统编程:提供API,能方便进行系统维护和管理,Linux下标志性语言之一,是很多系统管理员理想的编程工具。
图形处理:有PIL、Tkinter等图形库支持,能方便进行图形处理。
数学处理:NumPy扩展提供大量与许多标准数学库的接口。
文本处理:Python提供的re模块能支持正则表达式,还提供SGML,XML分析模块,许多程序员利用Python进行XML程序的开发。
数据库编程:程序员可通过遵循PythonDB-API(数据库应用程序编程接口)规范的模块与MicrosoftSQLServer,Oracle,Sybase,DB2,MySQL、SQLite等数据库通信。Python自带有一个Gadfly模块,提供了一个完整的SQL环境。
网络编程:提供丰富的模块支持sockets编程,能方便快速地开发分布式应用程序。很多大规模软件开发计划例如Zope,Mnet及BitTorrent.Google都在广泛地使用它。
Web编程:应用的开发语言,支持最新的XML技术。
多媒体应用:Python的PyOpenGL模块封装了“OpenGL应用程序编程接口”,能进行二维和三维图像处理。PyGame模块可用于编写游戏软件。
黑客编程: Python有一个hack的库,内置了你熟悉的或不熟悉的函数,但是缺少成就感。
本文参与华为云社区【内容共创】活动第20期。
https://bbs.huaweicloud.com/blogs/374925
任务29:python主要用来干什么?
- 点赞
- 收藏
- 关注作者
评论(0)