现在,一切就绪,我们可以准备启程!
Python是一门编程语言,能够帮助我们更好地与计算机“沟通”。不仅如此,它还是编程语言界里的新晋网红。
或许你会有疑问:Python凭什么从C++、Java等老牌编程语言中脱颖而出,成为一匹黑马呢?
打个比方好了,如果说编程语言是我们在新世界冒险中必备的武器,Python和Java、C、C++比起来,功能大概是这样的……
它的强大之处在于:
(1)它背后有着最庞大的免费“代码库”,给初学者足够的资源实现自己想要的功能。
(2)它是人工智能、大数据分析的重要支持语言。
(3)它被称为“胶水语言”,能很好包装和调用其他编程语言写的库。
(4)它是一个脚本语言,和其它编程语言相比更加简洁、高效。
最最重要的是,python应用领域广泛,例如:爬虫,数据分析,科学计算,自动化办公,自动化运维,网站开发,多媒体处理,机器学习,深度学习等。下图展示了学习python的知识框架。
说到这,就不得不提到最近在我身边发生的一件事儿:前阵子,公司的行政小姐姐来请教我关于Python学习的问题。
我想,不仅是她,你们也一样厌倦了把时间反反复复地花在无价值的劳动上吧。那么,不如勇敢迈出第一步,尝试做点什么,改变现状。
现在,那位对Python零基础的小姐姐,在花了一段时间学习之后,已经可以自己琢磨着编出个小程序来,让计算机帮忙批量整理数据。
有时侯你还能做出一些有趣的东西,看,利用Python当一回编程界“社会人”——让计算机给你画个画。
你是不是对python有了初步的认识了呢,其实呀,这只是冰山一角。答应我,跟着课程的步伐,我们一层层地揭开python神秘的面纱。
现在,你是不是偷偷地在心里立下了一个学习小目标了呢?目标是学习的持续动力,而且可以让我更好地为你制定学习路线和学习方案呢。
我今天要在这立下一个flag:学完python之后,可以
恭喜你,实现了『From Zero To Hero』的飞跃啦。目标——看得见的标靶,将赋予你努力和坚持的力量,这一刻,你成为了捍卫自己理想的英雄!
现在,我已经在python知识海洋里,为你定制了一条通往目标终点的学习路线。下面?是你的专属知识导航图。
在这个过程中,除了需要掌握python的基础知识,你还需要逐步掌握这几项技能:
HTML基础知识
爬虫四步:获取数据、解析数据、提取数据、存储数据对应的模块与应用
模拟登录,以及定时将爬虫结果发送邮箱
利用协程和scrapy框架优化爬虫效率和稳定性
常见应对反爬虫技巧
现在是不是一头雾水,但不用担心,这一路我为你准备许多『练练手』的小项目,通过『实战』让你更好地理解它们的原理。
比如:招聘网站信息爬取;电影、美食、菜谱、天气、音乐等生活信息爬取;财经股票等信息爬取等
『授人与鱼不如授人与渔』,我会在每个项目里设置各种不一样的『坑』。当你过关斩将之后,你也会和毕业的学员一样完成不可思议的东西。
有个从事电商行业的学员,每天都要在交易平台上逐条查看客户对产品的评论并做回访,工作量非常大。学完爬虫之后,他告诉我,他现在利用爬虫技术批量和自动化地获取客户评论和客户的基本信息,分析潜在客户并做回访,工作效率提高了很多,有更多的时间去享受生活。
某司市场部的一位小姐姐,利用爬虫技术批量收集竞争对手的销售情况和产品信息,并与自己公司的产品和销售情况作比较。根据信息,做价格和销售渠道的调整,业绩提升了不少。
有个学财务的学员告诉我『投资买股票不看上市公司的财务报告万万不可』,他学完爬虫之后爬取了3000+公司的财务报表并分析,挑选一个『潜力股』。还有的学员爬了北京市二手房交易的数据,来预测北京未来房价走势。
Python就是一个能够帮你实现需求的工具,它更像是一把万能钥匙,决定用它来打开哪一扇门的,是你自己。
『千里之行,始于足下』,无论终点在哪,『Python基础知识课』是我们路途的第一个里程碑!
下面,我为你设计了Python基础知识的学习路径。
Python基础语法知识就好比『内功』,只有深厚的『内功』才能更好地领悟和掌握各路招式。
此时,我想起了尼采在《查拉图斯特拉如是说》中的一句话『其实人跟树一样的,越是向往高处的阳光,他的根就要越要向下,伸向地底深处...』。
或许,在学习过程中你还不能一下敲出特别酷炫的代码,但你在这过程中会不断地提高,那一天也将会如期到来。『勤学似春起之苗,不见其增,而日有所长。』
既然目标和路径我们都已经清晰了,那我们的学习形式和教学方式是怎么样的呢?
我首先给你介绍一个在接下来学习中的重要助手:在线编译器,这是一个由风变编程首创,能让你真正实现“边学边练”的独门武器。
这个在线编译器由左右两部分组成。左边的框叫做代码框,我们往里面输入对计算机的指令:也就是代码本码,其实它就是程序员的工作台;右边的框我们叫它终端,它是显示你代码运行结果的地方,也就是用户看到的屏幕。
接下来我们经常会用到代码框和终端这两个词作为课堂练习的提醒,可不要把它们搞混了。
还有,非常nice的助教酱酱会一直在线,为你解答学习途中的疑惑。据说酱酱还给学员们准备了许多『大礼包』呢!
差点忘了,我们的学习社群里有许多爱学习的小伙伴,互相激励。
那对于个人而言,为了熟练地掌握编程和运用编程,让自己的能力得到提升,你必须做好投入精力认真学习的准备。
但与此同时,我也确信一点:如果你肯跟随着我的脚步向前走,那么我有足够的底气承诺这个路途将会轻松且富有乐趣。在你之前,已经有好多人证明过此事——他们在这个学习系统里,动辄玩到凌晨一两点钟,根本止不住学习的兴奋与踏实。
在编程界,有一句话非常出名,叫“Talk is cheap, show me the code.”——空谈无益,秀代码。
咱们现在就来体验一下Python如何施展人工智能的魔法:试着自己运行几段代码吧!
首先,来到你面前的是一个图像识别的小程序。它能做的是将写在纸上的文字,精准地识别出来。如下图:
来,下面是一段已经写好的代码,请直接点击【运行】。
import requests from aip import AipOcr image = requests.get('https://res.pandateacher.com/python_classic.png').content APP_ID = '16149264' API_KEY = 'yxYg9r4OuAs4fYvfcl8tqCYd' SECRET_KEY = 'yWg3KMds2muFsWs7MBSSFcgMQl8Wng4s' client = AipOcr(APP_ID, API_KEY, SECRET_KEY) res = client.basicGeneral(image) if 'words_result' in res.keys(): for item in res['words_result']: print(item['words']) else: APP_ID = '11756541' API_KEY = '2YhkLuyQGljPUYnmi1CFgxOP' SECRET_KEY = '4rrHe2BF828bI8bQy6bLlx1MelXqa8Z7' client = AipOcr(APP_ID, API_KEY, SECRET_KEY) res = client.basicGeneral(image) if 'words_result' in res.keys(): for item in res['words_result']: print(item['words']) else: print(res)
终端输出:
bash:74$ python ~/8ee553dc-5667-473f-8602-60e953e18473/classroom/apps-1-id-5cd9765519bbcf0001554795/74/main.py 优美胜于丑陋 明了胜于晦涩 简洁胜于复杂 复杂胜于凌乱 扁平胜于嵌套 间隔胜于紧湊
你已经看到了,机器能精准地识别图片中的文字,这就是我们能通过Python帮计算机做到的:图像识别,让计算机拥有“眼睛”,看懂图片。‘
你知道,图像识别是人工智能领域的一个应用。下面,我们再来一个更厉害的:真正地运行一个人工智能小程序,和计算机进行“对话”。它其实就是Python码出来的Siri。
请直接在左边的代码区点击运行,然后根据提示操作:第1步:点击左边代码区的运行按钮;第2步:在右边的终端区域(注意不是左边)任意问一个问题。第3步:敲击键盘的回车键执行。
import urllib.parse import hashlib import time import random import string import requests import sys import readline def curl_md5(src): m = hashlib.md5(src.encode('UTF-8')) # 将得到的MD5值所有字符转换成大写 return m.hexdigest().upper() """ get_req_sign :根据 接口请求参数 和 应用密钥 计算 请求签名 参数说明 -pa:接口请求参数 -apk:应用密钥 返回数据 -签名结果 """ def get_req_sign(pa, apk): # 1.字典升序排序 pa_list = list(pa.items()) pa_list.sort() # 2.拼按URL键值对 tem_str = '' for i in range(len(pa_list)): if pa_list[i][1]: tem_str += (pa_list[i][0] + '=' + urllib.parse.quote(pa_list[i][1]) + '&') # 3.拼接app_key tem_str += ('app_key=' + apk) # 4.MD5运算 + 转换大写,得到请求签名 sign = curl_md5(tem_str) return sign def get_params(plus_item): # 请求时间戳(秒级),用于防止请求重放(保证签名5分钟有效) t = time.time() time_stamp = str(int(t)) # 请求随机字符串,用于保证签名不可预测 nonce_str = ''.join(random.sample(string.ascii_letters + string.digits, 10)) global se app_id = '2127007340' app_key = '9Fm2D9tkB4lEjZ89' params = { 'app_id': app_id, 'time_stamp': time_stamp, 'nonce_str': nonce_str, 'question': plus_item, 'sign': '', 'session': se } params['sign'] = get_req_sign(params, app_key) return params def get_content(plus_item): # 聊天的API地址 url = "https://api.ai.qq.com/fcgi-bin/nlp/nlp_textchat" # 获取请求参数 plus_item = plus_item.encode('UTF-8') payload = get_params(plus_item) r = requests.post(url, data=payload) if r.json()["ret"] == 0: print('吴小枫:' + r.json()["data"]["answer"]) else: print('今天我出了一点小问题~快联系助教帮忙解决一下~~') sys.exit() feature_text = [''' 大家好!我是你的聊天机器人吴小枫。 我有问必答,有人会问我“今天深圳天气怎么样?”,也有人问我“你喜欢我吗?” 快来问我问题呀,欢迎来撩! >''', ''' 再来问我点啥吧!我把我知道的都告诉你,嘻嘻! >''', ''' # 我有点饿了,再和你聊完最后一句,我就要下线啦!你还有什么要问我的? # >'''] se = str(random.randint(1, 10000)) for i in range(len(feature_text)): comment = input(feature_text[i]) get_content(comment) time.sleep(1) print('\n我走啦,下次见!')
终端输出:
bash:78$ python ~/8ee553dc-5667-473f-8602-60e953e18473/classroom/apps-1-id-5cd9765519bbcf0001554795/78/main.py 大家好!我是你的聊天机器人吴小枫。 我有问必答,有人会问我“今天深圳天气怎么样?”,也有人问我“你喜欢我吗?” 快来问我问题呀,欢迎来撩! >
你是不是看到在黑色的终端里冒出了一个小机器人,正在试探着和你对话?
那么,恭喜你!你已经亲手运行了自己的两个人工智能小程序!
print()函数
恭喜你已经步入了python新世界,让我们使用print()开启对python的第一声问候!print()函数的用法有以下几种:单枪匹马——不带引号、搭配单引号、搭配双引号、搭配三引号,我们逐个见识下吧!
无引号
你会看到下面左侧代码框内,已经有一些代码。那是我为你准备的彩蛋,不要把他们删掉了哦。再将print(520)这段代码一字不差地抄写在第3行,抄写完后,点击【运行】按钮。
注意,在正式敲代码之前,必须切换成英文输入状态,保证print()函数的括号是用【英文括号】,不然会报错?。【切换英文输入的Tips:Mac系统请按command+空格键切换中英文输入,Windows系统请按ctrl+shift键切换中英文输入】
import time print ('在'+time.strftime("%Y-%m-%d %H:%M:%S", time.localtime())+',我写了人生中第一行Python代码\n它的内容虽然简单,不过是平凡的一句print(520)\n但我知道:我的编程之路,将从最简单的520开始\n在我点击运行的同时,一切在这一刻起开始变得不同\n以下,是这行代码的运算结果:' ) print(520)
终端输出:
bash:88$ python ~/8ee553dc-5667-473f-8602-60e953e18473/classroom/apps-1-id-5cd9765519bbcf0001554795/88/main.py 在2020-04-15 11:15:17,我写了人生中第一行Python代码 它的内容虽然简单,不过是平凡的一句print(520) 但我知道:我的编程之路,将从最简单的520开始 在我点击运行的同时,一切在这一刻起开始变得不同 以下,是这行代码的运算结果: 520
你已经成功写出了人生中的第一行Python代码,它的内容虽然简单,不过是平凡的一句print(520),但是一切在这一刻开始变得不同!
你能够实现与计算机交互的“初体验”,离不开print()函数的帮忙。这也是我们即将解锁的第一个Python语法知识点。
刚才,虽然你只是输入了一个简单的print,但在背后,这段Python代码却帮你做了这样的一些事情:
(0)我们向计算机发出指令:“打印‘520’”;(1)Python把这行代码编译成计算机能听懂的机器语言;(2)计算机做出相应的执行;(3)最后把打印结果呈现在我们面前。
这,就是我们通过Python这个工具,成功与计算机实现沟通的方式。
接下来,你即将进入到《千与千寻》的世界,在故事里进一步地学习print()函数的用法。(提示:即便没看过《千与千寻》也不影响你理解后面的代码知识。)
千寻与爸爸妈妈误入了鬼怪神灵休息的世界,为了拯救因为贪食而被变成猪的父母,千寻需要在这个世界里为汤婆婆打工,在卖身契上签下自己的名字。
在Python的魔法世界,我们如果想让计算机帮忙写出千寻的名字,该怎么运用print()函数对计算机发出指令呢?
观察一下上面这行代码的结构,再敲一下回车键,把上面这行代码原样复制到代码框中,点击运行,看看会出现什么结果。
print('千寻')
终端输出:
bash:101$ python ~/8ee553dc-5667-473f-8602-60e953e18473/classroom/apps-1-id-5cd9765519bbcf0001554795/101/main.py 千寻
看,屏幕上是不是出现了千寻的名字?这就是print()函数的主要功能:打印内容。
在这里,打印的意思是:让计算机把你给它的指令结果,显示在屏幕的终端上。
单引号的用法
到这里,你已经亲自使用过两次print()函数了。我们来观察一下,你两次写下的print()函数语句有什么不一样的地方呢?
print(520) print('千寻')
很明显,你会发现,在print('千寻')里,多了一对单引号。【注意⚠️:单引号是英文输入法下的单引号!】
那么问题又来了:这个单引号是干啥用的?为什么打印文字的时候需要加上引号呢?
这是因为,计算机的脑回路比较特别:只能理解数字,却读不懂文字。因为数字和数学运算是标准化、有固定格式的,而文字却能够千变万化。
如果你直接让计算机print(千寻),它会一脸懵并大声报错:“这两个字啥意思,你没有定义清楚,不懂诶……”
这,便是print()函数中引号的用法:当括号内有引号的时候,就相当于告诉计算机——你不需要执行多余的操作,我输入什么,你就打印什么。
双引号的用法
在print()函数内不仅能使用单引号,还能使用双引号,两者的效果没什么区别,都能让你打印出一行文本。【注意⚠️:双引号是英文输入法下的双引号,而不是两个单引号!】
有些时候,单引号和双引号可能会在括号内同时出现,比如print("Let's play")。
这种情况下,需要注意区分清楚哪个引号是属于print()函数结构,哪个引号是属于你要让计算机打印的内容,可别“混搭”了。
说这么多,运行一下代码就懂了。直接在下面代码框中点击运行,观察运行结果。(点击运行前先思考一下,在第三个print()函数中,哪个引号才属于print()函数结构)
# 括号内是单引号的情况。 print('一起玩吧') # 括号内是双引号的情况。 print("一起玩吧") # 括号内单双引号同时存在的情况。 print("Let's play")
终端输出:
bash:119$ python ~/8ee553dc-5667-473f-8602-60e953e18473/classroom/apps-1-id-5cd9765519bbcf0001554795/119/main.py 一起玩吧 一起玩吧 Let's play
我们观察上面的代码,发现多了一些带有『#』的语句,它是怎么一回事呢?
其实呀在python里,『#』常用作单行注释符号,用于解释单行代码,比如 『# 括号内是单引号的情况』用于解释说明代码『print('一起玩吧')』。#号后边的任何数据在代码运行的阶段不会被输出。
回到print()函数,在print("Let's play")中,没有被打印出来的引号就属于print()函数结构啦。
不过,在print()函数中,引号里的内容其实也不一定非得是文字,还可以是英文和数字。
相应地,在括号内没有引号的情况下,我们应该往括号内放入计算机能够“理解”的内容,如:数字或数学运算。
此时,print函数会让计算机尝试去“读懂”括号里的内容,并打印最终的结果。
因此,当计算机读懂数据数字后,就打印这个数据。当读懂数字运算后,则打印得到运算结果。
单选题
要不然,我们来猜猜看,在代码框输入下列代码的话,计算机会在终端输出什么结果? print(1+1)
猜对啦!但是为什么打印的结果是2,而不是1+1呢?
在这里,计算机并没有再原样打印“1+1”,因为print(1+1)是计算机能直接读懂的数学运算,所以,它会直接打印出最终的运算结果:“2”。这就是计算机“读懂内容”的表现。
关于“运算”相关的知识,明天我们在讲解数据类型的时候将会进一步讲解。现在,你只需要了解print()函数,以及其带引号和不带引号的用法区别就好。
到这里,print()函数相关的知识就讲完啦。下面,是时候来做一道课堂练习,检验一下自己的学习成果了。
单选题
下面代码中,哪一项能成功打印出结果【酱酱超可爱】?
答对了!A选项漏了括号和引号;B选项用了不同的引号,会报错;C选项漏了引号。
完成了选择题,接下来,我们来试试自己用print()函数打印出“千寻的卖身契”。
为了让千寻替自己工作,汤婆婆拟了一份反人类的“血汗条款”:
我愿意留在汤婆婆的澡堂里工作两年,如果我违背工作内容的话,将在这个世界变成一头猪。
那么,这份合约在Python中要如何显示呢?请你在下面的代码框中将这份合约打印出来(注意:使用print()函数,文字部分可直接复制上面的内容)。
相信你已经顺利地打印出千寻的合约了(这也意味着,我们的小千寻要苦兮兮地开始做打工妹了……)。老师的答案是这样的:
print('我愿意留在汤婆婆的澡堂里工作两年,如果我违背工作内容的话,将在这个世界变成一头猪。')
三引号的用法
But,苛刻的汤婆婆觉得卖身契的排版还不够好看,希望你能让卖身契文字的每一个逗号后面都换行显示,打印出“自动换行”的效果。
答案是:在print内部使用三引号''' 来实现跨行输出。【注意⚠️:三引号是英文输入法下的三个单引号!】
嘿嘿,没想到吧,除了单引号和双引号之外,print()里面居然还能放三引号。直接运行下面这段代码,看这次能不能实现汤婆婆想要的效果。
print('''我愿意留在汤婆婆的澡堂里工作两年, 第一年在锅炉房和锅炉爷爷一起烧锅炉水, 将在这个世界变成一头猪。 ''')
终端输出:
print('''我愿意留在汤婆婆的澡堂里工作两年, 第一年在锅炉房和锅炉爷爷一起烧锅炉水, 将在这个世界变成一头猪。 ''')
成功了!你已经掌握了用三引号换行的办法。
现在我们已经学习了print()函数的四种情况--无引号,单引号,双引号,三引号。再跟着老师一起回顾一下它们之间的差别,巩固一下。
注意,【前方高能预警】,接下来,我要告诉你一个99%的初学者都踩过的代码bug。
在Python中,默认所有正确的语法,包括标点符号都是【英文】。不小心用了中文标点的话,计算机会无法识别,然后报错。
在终端里,你能看到的最常见的符号报错提示就是【syntaxError:invalid syntax】(语法错误:无效语法)。
我们在debug(解决程序报错)的时候,需要下意识地找找自己是否犯了这样细小却致命的错误。
重要提示说完。此时此刻,你已经完成了这一关60%的进度条,通关成就达成近在眼前!
转义字符
你已经用print()函数成功打印出了千寻的卖身契。
print('''我愿意留在汤婆婆的澡堂里工作两年, 第一年在锅炉房和锅炉爷爷一起烧锅炉水, 将在这个世界变成一头猪。 ''')
其实,还有第二种实现换行的办法:使用转义字符\n,像这样:
print('我愿意留在汤婆婆的澡堂里工作两年,\n如果我违背工作内容的话,\n将在这个世界变成一头猪。')
除了\n之外,转义字符还有很多,它们的特征就是:反斜杠+想要实现的转义功能首字母。
比如换行\n代表【+newline】;退格\b代表【+backspace】;回车\r代表【+return】。大家可以按照这种方法记住转义字符的含义。
我把常用的一些转义字符做了个总结:
别担心,这张图上的内容你不需要背下来,先通过截屏或拍照方式把图片保存下来,以后要使用转义字符时再看图查找就好。