Python[人工智能]時代的立身武器
人工智能正在悄然地改變我們的生活方式,傳統行業紛紛轉型,科幻電影的一幕幕正在變成現實。
隨着技術的變革,人類簡單重複性的勞動或思考活動已經逐步被機器取代。那麼,該如何改變工作方式和學習思維?如何利用技術加持競爭力?
在互聯網+時代,『編程』已不是『程序員』、『工程師』的專屬,而是一個通往未來世界的工具,甚至是一個新的機遇。
如果現在想掌握編程技能的話,小迪強烈推薦你Python,它無處不在!
Python是一門編程語言,能夠幫助人們更好地與計算機“溝通”。不僅如此,它還是編程語言界裏的新晉網紅。
或許很多人會有疑問:Python憑什麼從C++、Java等老牌編程語言中脫穎而出,成爲一匹黑馬呢?小迪本人會C、C++、C#、javascript,但是自認爲python是其中最爲簡單和最好理解的語言。打個比方好了,如果說編程語言是我們在新世界冒險中必備的武器,Python和Java、C、C++比起來,功能大概是這樣的……
它的強大之處在於:
(1)它背後有着最龐大的免費“代碼庫”,給初學者足夠的資源實現自己想要的功能。
(2)它是人工智能、大數據分析的重要支持語言。
(3)它被稱爲“膠水語言”,能很好包裝和調用其他編程語言寫的庫。
(4)它是一個腳本語言,和其它編程語言相比更加簡潔、高效。
最最重要的是,python應用領域廣泛,例如:爬蟲,數據分析,科學計算,自動化辦公,自動化運維,網站開發,多媒體處理,機器學習,深度學習等。下圖展示了學習python的知識框架。
說到這,大多數人也一樣厭倦了把時間反反覆覆地花在無價值的勞動上吧。那麼,不如勇敢邁出第一步,嘗試做點什麼,改變現狀。可能曬微花了一段時間學習之後,已經可以自己琢磨着編出個小程序來,讓計算機幫忙批量整理數據。
有時侯還能做出一些有趣的東西,看,利用Python當一回編程界“社會人”——讓計算機畫個畫。
對於自動化辦公,python絕對是一大神器,使用python實現審計底稿的批量自動化處理。
文檔管理:shutil和zipfile,自動完成複製/移動/改名/刪除/讀取/解壓/壓縮
數據處理:openpyxl和csv,自動處理excel和csv數據
文字處理:docx和pyPDF2,處理word和pdf文檔
信息傳輸:使用Python發送郵件/微信/短信
比如:批量更新excel表格的信息,自動定時發送郵件等
Python就是一個能夠幫人們實現需求的工具,它更像是一把萬能鑰匙,決定用它來打開哪一扇門的,是編寫它的主人。
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)
終端打印
優美勝於醜陋
明瞭勝於晦澀
簡潔勝於複雜
複雜勝於凌亂
扁平勝於嵌套
間隔勝於緊湊
已經看到了,機器能精準地識別圖片中的文字,這就能通過Python幫計算機做到的:圖像識別,讓計算機擁有“眼睛”,看懂圖片。
圖像識別是人工智能領域的一個應用。下面再來一個更厲害的例子:真正地運行一個人工智能小程序,和計算機進行“對話”。它其實就是Python碼出來的Siri。
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我走啦,下次見!')
大家好!我是你的聊天機器人大白。
我有問必答,有人會問我“今天北京天氣怎麼樣?”,也有人問我“你喜歡我嗎?”
快來問我問題呀,歡迎來撩!
>北京怎麼樣啊?
>大白:首都大城市再來問我點啥吧!我把我知道的都告訴你,嘻嘻!
>我長得怎麼樣?
>大白:我猜應該不錯# 我有點餓了,再和你聊完最後一句,我就要下線啦!你還有什麼要問我的?
>我不想和你聊了
>大白:那就關掉唄# 我有點餓了,再和你聊完最後一句,我就要下線啦!你還有什麼要問我的?
# >趕緊下線吧
大白:好的,那我下啦。我走啦,下次見!
恭喜已經步入了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)
在2020-05-24 10:40:26,我寫了人生中第一行Python代碼
它的內容雖然簡單,不過是平凡的一句print(520)
但我知道:我的編程之路,將從最簡單的520開始
在我點擊運行的同時,一切在這一刻起開始變得不同
以下,是這行代碼的運算結果:
520
已經能夠實現與計算機交互的“初體驗”,離不開print()函數的幫忙。這也是即將解鎖的第一個Python語法知識點。
剛纔,雖然只是輸入了一個簡單的print,但在背後,這段Python代碼卻幫你做了這樣的一些事情:
(0)向計算機發出指令:“打印‘520’”;
(1)Python把這行代碼編譯成計算機能聽懂的機器語言;
(2)計算機做出相應的執行;
(3)最後把打印結果呈現在眼前。
通過Python這個工具,成功與計算機實現溝通的方式。
在Python的魔法世界,如果想讓計算機幫忙寫出自己的名字,該怎麼運用print()函數對計算機發出指令呢?
print('小迪')
小迪
看,屏幕上是不是出現了自己的名字?這就是print()函數的主要功能:打印內容。
在這裏,打印的意思是:讓計算機把你給它的指令結果,顯示在屏幕的終端上。
單引號的用法
到這裏,已經親自使用過兩次print()函數了。來觀察一下,兩次寫下的print()函數語句有什麼不一樣的地方呢?
print(520)
print('小迪')
很明顯,在print(‘小迪’)裏,多了一對單引號。【注意⚠️:單引號是英文輸入法下的單引號!】
那麼問題又來了:這個單引號是幹啥用的?爲什麼打印文字的時候需要加上引號呢?
這是因爲,計算機的腦回路比較特別:只能理解數字,卻讀不懂文字。因爲數字和數學運算是標準化、有固定格式的,而文字卻能夠千變萬化。
如果直接讓計算機print(千尋),它會一臉懵並大聲報錯:“這兩個字啥意思,你沒有定義清楚,不懂誒……”
這便是print()函數中引號的用法:當括號內有引號的時候,就相當於告訴計算機——你不需要執行多餘的操作,我輸入什麼,你就打印什麼。
雙引號的用法
在print()函數內不僅能使用單引號,還能使用雙引號,兩者的效果沒什麼區別,都能讓你打印出一行文本。【注意⚠️:雙引號是英文輸入法下的雙引號,而不是兩個單引號!】
有些時候,單引號和雙引號可能會在括號內同時出現,比如print(“Let’s play”)。
這種情況下,需要注意區分清楚哪個引號是屬於print()函數結構,哪個引號是屬於要讓計算機打印的內容,可別“混搭”了。
說這麼多,運行一下代碼就懂了。直接在下面代碼框中點擊運行,觀察運行結果。(點擊運行前先思考一下,在第三個print()函數中,哪個引號才屬於print()函數結構)
# 括號內是單引號的情況。
print('一起玩吧')
# 括號內是雙引號的情況。
print("一起玩吧")
# 括號內單雙引號同時存在的情況。
print("Let's play")
一起玩吧
一起玩吧
Let’s play
觀察上面的代碼,發現多了一些帶有『#』的語句,它是怎麼一回事呢?
其實呀在python裏,『#』常用作單行註釋符號,用於解釋單行代碼,比如 『# 括號內是單引號的情況』用於解釋說明代碼『print(‘一起玩吧’)』。#號後邊的任何數據在代碼運行的階段不會被輸出。
回到print()函數,在print("Let's play")
中,沒有被打印出來的引號就屬於print()函數結構啦。
不過,在print()函數中,引號裏的內容其實也不一定非得是文字,還可以是英文和數字。相應地,在括號內沒有引號的情況下,應該往括號內放入計算機能夠“理解”的內容,如:數字或數學運算。此時,print函數會讓計算機嘗試去“讀懂”括號裏的內容,並打印最終的結果。因此,當計算機讀懂數據數字後,就打印這個數據。當讀懂數字運算後,則打印得到運算結果。如print(1+1)
是計算機能直接讀懂的數學運算,所以,它會直接打印出最終的運算結果:“2”。這就是計算機“讀懂內容”的表現。
三引號的用法
如果希望能讓文字的每一個逗號後面都換行顯示,打印出“自動換行”的效果。
答案是:在print內部使用三引號'''
來實現跨行輸出。【注意⚠️:三引號是英文輸入法下的三個單引號!】除了單引號和雙引號之外,print()裏面居然還能放三引號,直接運行下面這段代碼。
print('''我願意留在湯婆婆的澡堂裏工作兩年,
第一年在鍋爐房和鍋爐爺爺一起燒鍋爐水,
將在這個世界變成一頭豬。
''')
bash:144$ python ~/classroom/apps-1-id-5cd9765519bbcf0001554795/144/main.py
我願意留在湯婆婆的澡堂裏工作兩年,
第一年在鍋爐房和鍋爐爺爺一起燒鍋爐水,
將在這個世界變成一頭豬。
現在已經學習了print()函數的四種情況--無引號,單引號,雙引號,三引號。鞏固一下。
注意,【前方高能預警】,一個99%的初學者都踩過的代碼bug。在Python中,默認所有正確的語法,包括標點符號都是【英文】。不小心用了中文標點的話,計算機會無法識別,然後報錯。在終端裏,能看到的最常見的符號報錯提示就是【syntaxError:invalid syntax】(語法錯誤:無效語法)。
在debug(解決程序報錯)的時候,需要下意識地找找是否犯了這樣細小卻致命的錯誤。
轉義字符
其實之前的換行案例,還有第二種實現換行的辦法:使用轉義字符\n
,像這樣:
print('我願意留在湯婆婆的澡堂裏工作兩年,\n如果我違背工作內容的話,\n將在這個世界變成一頭豬。')
除了\n
之外,轉義字符還有很多,它們的特徵就是:反斜槓+想要實現的轉義功能首字母。比如換行\n
代表【+newline】;退格\b
代表【+backspace】;回車\r代表【+return】。小迪把常用的一些轉義字符做了個總結:
變量和賦值
name='千尋'
這就是一個常見的“給變量賦值”的動作。在這裏,name就是一個變量,這行代碼的意思,就是把“千尋”這兩個字【賦值】給了“name”這個【變量】。這就好比,爲了在日後能在計算機中更方便地找到她的名字,我們幫她把名字收納進了一個小盒子裏,並在這個盒子上貼了個叫“name”的標籤。回想一下,平時在收拾東西的時候,是不是會把散落各處東西放進不同的盒子裏,並且做好標記?這樣的“收納”動作,能夠讓空間變得整齊,也更方便我們自己取用東西。
同理,計算機也是這麼做的,它會把成千上萬的數據放在不同的“盒子”裏,這樣才方便它存儲和操作數據。這個“盒子”在Python中被稱爲變量,在這個“盒子”裏放任何想放的內容。而這個往盒子裏裝東西的過程,在代碼的魔法世界被稱爲【賦值】。
name='千尋'
name='小千'
print(name)
小千
終端上出現的結果是不是【小千】?可這又是爲什麼呢?對“name”這個變量第一次的賦值不是【‘千尋’】嗎?爲什麼打印的結果是第二次的賦值呢?
這就涉及到了變量的特點:變量之所以稱爲變量,是因爲它保存的數據是可以隨意變化的。可以將變量當作一個盒子,可以在這個盒子裏放任何內容,但盒子都有它的最大容量,不能無限制地塞東西。偏偏在代碼世界裏,盒子的容量又特別小,僅爲1。所以當你需要放進新的東西時,只能尋找一個新的盒子。
在上面的案例中,第一行代碼:name='千尋'
表達的意思是:把千尋這個名字放到name這個變量“盒子”中。由於,計算機是一行行自上而下執行代碼的,所以當運行到第二行代碼name='小千'
時,變量“name”裏存儲的【‘千尋’】就被替換成了【‘小千’】。所以,當運行到第三行print(name)
時,打印出的結果,就自然而然的是小千了。其實,不僅是千尋,名字對於每個人來講都是有意義的,它幫助你“定位”自己,讓別人能輕鬆地找到你。所以,人的名字不能亂取,同理,給變量的命名也需要遵循一定的規範。
變量的命名規範
對於變量的命名,可以遵循以下規範:
比如說,如果信息是姓名,那麼變量可以命名爲name;如果信息是數字,那麼變量名則應該叫做number。很多新手在剛入門的時候會習慣給變量命名爲a、b、c等英文字母。這樣的變量名會讓你無法從諸多信息中分辨出變量裏裝的東西是什麼,這無異於給自己的孩子取名叫做“張小紅”、“王小明”,一下就淹沒於茫茫人海之中了。
除了變量命名之外,還要注意的是:在代碼世界中,賦值符號=
不是左邊等於右邊的意思。僅僅表示賦值動作:把右邊的內容放到了左邊的盒子中。代表左右兩邊相等的符號,是比較運算符==
,雖然他倆長得像,但代表的卻是完全不同的意思,可千萬不要搞混了。
雖然print()函數是最簡單的語句,但其實,往後要做的任何一個程序幾乎都離不開print()函數的支持。例如說,能用print()函數給自己創造一個可愛的好朋友“人工智障小埋”,她會蹦躂着到你面前,調皮地讓你猜她的年齡。
注意:在小埋問你她的年齡時,要記得在【終端】輸入你猜的數字哦。
import random
import time
###提示語部分
print('你好,我是機器人小埋,我們來玩個猜年齡的小遊戲吧~(◆◡◆)')
time.sleep(2)
print('''
=============================
=============================
''')
time.sleep(1)
print('小埋的真實年齡在1到10之間哦~')
time.sleep(1)
print('不過,你只有5次機會哦~')
time.sleep(1)
print('下面,請輸入小埋的年齡吧:')
#從0至10產生一個隨機整數,並賦值給變量age
age = random.randint(1,10)
#設置次數
for guess in range(1,6):
#輸入玩家猜測的年齡
choice=int(input())
#判讀玩家輸入的年齡是否等於正確的年齡
if choice<age:
print('小埋的提示:你猜小了(;´д`)ゞ。。。。')
elif choice>age:
print('小埋的提示:乃猜大了惹(>﹏<)~~')
else:
print('猜了'+str(guess)+'次,你就猜對惹~hiu(^_^A;)~~~')
break
#判斷猜測次數
if choice == age:
print('搜噶~那麼小埋下線了~拜拜~( ̄︶ ̄)↗')
else:
print('哎呀~你還是木有猜對啊~但是你只有5次機會誒~怎麼辦啊~')
print('那好吧~心軟的小埋只好告訴你,我才'+str(age)+'歲哦~(*/ω\*)')
你好,我是機器人小埋,我們來玩個猜年齡的小遊戲吧~(◆◡◆)
=============================
=============================
小埋的真實年齡在1到10之間哦~
不過,你只有5次機會哦~
下面,請輸入小埋的年齡吧:
5
小埋的提示:你猜小了(;´д`)ゞ。。。。
8
小埋的提示:你猜小了(;´д`)ゞ。。。。
9
猜了3次,你就猜對惹~hiu(_A;)~~~
搜噶~那麼小埋下線了~拜拜~( ̄︶ ̄)↗
除了print()函數和變量賦值之外,這段代碼裏還用到了條件判斷if語句、input()函數,這兩個知識點我們會在後面學習到。而這一關卡里,大家掌握了命令思維——對計算機下“打印”的指令。但是,在與計算機溝通的道路上,我們的學習纔剛剛開始。
下關預告
其實,Python世界只是現實世界的鏡像,Python世界裏的東西都可以在現實世界裏找到對應。那麼現實世界中最常見的數字,文字在鏡像世界裏長什麼樣呢?如何使用它們?
比如說,如何利用鏡像世界的數據進行復雜的科學計算,並把數字結果和解釋語言一起輸出到屏幕,展現給用戶呢?
後面,小迪會一同深入鏡像世界裏探其究竟,揭祕【鏡像世界的數據】。
Demo
例子:打印
介紹:
除了文字和數字之外,還可以靈活運用print()函數,打印出帶特殊格式的東西
へ /|
/\7 ∠_/
/ │ / /
│ Z _,< / /`ヽ
│ ヽ / 〉
Y ` / /
イ● 、 ● ⊂⊃〈 /
() へ | \〈
>ー 、_ ィ │ //
/ へ / ノ<| \\
ヽ_ノ (_/ │//
7 |/
>―r ̄ ̄`ー―_
print(""" へ /|
/\7 ∠_/
/ │ / /
│ Z _,< / /`ヽ
│ ヽ / 〉
Y ` / /
イ● 、 ● ⊂⊃〈 /
() へ | \〈
>ー 、_ ィ │ //
/ へ / ノ<| \\
ヽ_ノ (_/ │//
7 |/
>―r ̄ ̄`ー―_""");
例子:轉義字符
要求:
運用轉義字符按照如下格式打印出來。其中,具體文字會在【書寫代碼】
步驟中直接提供。
'Python’是一種計算機程序設計語言。
你可能已經聽說過很多種流行的編程語言,比如非常難學的C語言,非常流行的Java語言,適合初學者的Basic語言,適合網頁編程的JavaScript語言等等。
那’Python’是一種什麼語言?
參考:
方法一:
1.根據題目可知,本題需要運用三個知識點:換行,運用轉義字符將單引號打印出來,打印函數。
2.換行\n
3.轉義引號\'
4.打印函數print()
【提示】
請注意是反斜槓\
,並且反斜槓在前。
方法二:
直接使用三引號,打印出內容裏的單引號並且實現換行
print("""'Python'是一種計算機程序設計語言。
你可能已經聽說過很多種流行的編程語言,比如非常難學的C語言,非常流行的Java語言,適合初學者的Basic語言,適合網頁編程的JavaScript語言等等。
那'Python'是一種什麼語言?""")
print("\n\'Python\'是一種計算機程序設計語言。\n
你可能已經聽說過很多種流行的編程語言,比如非常難學的C語言,非常流行的Java\n語言,適合初學者的Basic語言,適合網頁編程的JavaScript語言等等。
那\'Python\'是一種什麼語言?\n")
(後續待補充)