說(shuō)明:
=====
1.1 如果不會(huì)web前端的html、JavaScript、CSS的知識(shí)怎么辦?無(wú)所不能的python可以做到。
1.2 Remi是一個(gè)用于Python應(yīng)用程序的GUI庫(kù),它將應(yīng)用程序的界面轉(zhuǎn)換為HTML,以便在Web瀏覽器中呈現(xiàn)。
1.3 這將刪除特定于平臺(tái)的依賴項(xiàng),并允許您使用Python輕松開發(fā)跨平臺(tái)應(yīng)用程序!
2 準(zhǔn)備:
=====
2.1 官網(wǎng)地址:
https://github.com/dddomodossola/remi
https://remi.readthedocs.io/en/latest/
2.2 環(huán)境:
華為筆記本電腦、深度deepin-linux操作系統(tǒng)、谷歌瀏覽器、python3.8和微軟vscode編輯器。
2.3 安裝:
pip install remi
#本機(jī)安裝
sudo pip3.8 install remi
sudo pip3.8 install -i https://mirrors.aliyun.com/pypi/simple remi
3 Hello world:
==========
3.1 代碼:注釋版
import remi.gui as gui
from remi import start, App
#定義類
class MyApp(App):
def __init__(self, *args):
super(MyApp, self).__init__(*args)
#以上3行代碼,固定初始化
def main(self):
#實(shí)例化一個(gè)VBox,大小設(shè)置
wid=gui.VBox(width=300, height=200)
#窗口的標(biāo)簽label=顯示文本,大小比例法設(shè)置
# 注意\n代表?yè)Q行,但需要配合style={"white-space":"pre"},才起作用
#preserves newline==保留換行符
self.lbl=gui.Label('Hello\n World', width='80%', height='50%',style={"white-space":"pre"})
#按鈕和名稱、大小設(shè)置,支持中文
self.bt=gui.Button('Press me=點(diǎn)擊我!', width=200, height=30)
#綁定按鈕的點(diǎn)擊事件,調(diào)用函數(shù)
self.bt.onclick.do(self.on_button_pressed)
#adding the widgets to the main container
#將小部件添加到主容器wid,有時(shí)候上面實(shí)例化用container=主容器
wid.append(self.lbl)
wid.append(self.bt)
return wid
# listener function==監(jiān)聽功能
#調(diào)用點(diǎn)擊按鈕函數(shù);emitter==發(fā)射器
def on_button_pressed(self, emitter):
self.lbl.set_text('Hello World!')
if __name__=="__main__":
# starts the webserver
# 主要參數(shù)
# start(MyApp,address='127.0.0.1', port=8081, multiple_instance=False,enable_file_cache=True, update_interval=0.1, start_browser=True)
#start(MyApp, debug=True, address='0.0.0.0', port=0) #本機(jī)測(cè)試地址改動(dòng)無(wú)效,為默認(rèn)地址
start(MyApp, debug=True) #端口指定無(wú)效,也不是默認(rèn)8081,估計(jì)本機(jī)端口已經(jīng)被占用
3.2 操作和效果:
4 Bootstrap:
=========
4.1 代碼:bootstrap.py
import remi.gui as gui
from remi import start, App
class MyApp(App):
def __init__(self, *args):
super(MyApp, self).__init__(*args)
def main(self):
#引入在線Bootstrap的css文件
my_css_head="""
<link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.7/css/bootstrap.min.css">
"""
#引入在線Bootstrap的js文件
my_js_head="""
<script src="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.7/js/bootstrap.min.js"></script>
"""
self.page.children['head'].add_child('mycss', my_css_head)
self.page.children['head'].add_child('myjs', my_js_head)
#主窗口實(shí)例化,定義大小和樣式
main_container=gui.VBox(width='500px', height='500px', style={'margin':'0px auto','padding':'10px'})
#label=標(biāo)簽
self.lbl=gui.Label("Label with Lock Icon=帶鎖圖標(biāo)的標(biāo)簽")
#樣式選擇
self.lbl.add_class("glyphicon glyphicon-lock label label-primary")
#輸入框
self.tf=gui.TextInput(hint='Your Input')
#樣式選擇
self.tf.add_class("form-control input-lg")
#下拉選擇框
self.dd=gui.DropDown(width='200px')
#字體大小
self.dd.style.update({'font-size':'large'})
#樣式選擇
self.dd.add_class("form-control dropdown")
#下拉框內(nèi)容選擇
self.item1=gui.DropDownItem("First Choice")
self.item2=gui.DropDownItem("Second Item")
#定義self的功能,目前未定義
self.dd.append(self.item1,'item1')
self.dd.append(self.item2,'item2')
#Table=表格,第一個(gè)是表頭
myList=[ ('ID','Lastname','Firstname','郵編','城市'),
('1','Pan','Peter','888888','上海'),
('2','Sepp','Schmuck','123456','北京') ]
#表格設(shè)置,內(nèi)容,大小
self.tbl=gui.Table.new_from_list(content=myList,width='400px',height='100px',margin='10px')
#樣式選擇
self.tbl.add_class("table table-striped")
#按鈕設(shè)置
self.bt1=gui.Button("OK", width="100px")
#是Bootstrap樣式 Class: btn-success
self.bt1.add_class("btn-success")
self.bt2=gui.Button("Abbruch",width="100px")
#Bootstrap Class: btn btn-danger
self.bt2.add_class("btn-danger")
#Build up the gui,主窗口掛載下面項(xiàng)目
main_container.append(self.lbl,'lbl')
main_container.append(self.tf,'tf')
main_container.append(self.dd,'dd')
main_container.append(self.tbl,'tbl')
main_container.append(self.bt1,'btn1')
main_container.append(self.bt2,'btn2')
return main_container
if __name__=="__main__":
# starts the webserver
start(MyApp, debug=True)
4.2 操作和效果圖:
5 tabbox:
=======
5.1 代碼:
import remi.gui as gui
from remi import start, App
class MyApp(App):
def __init__(self, *args):
super(MyApp, self).__init__(*args)
def main(self):
#按鈕
b1=gui.Button('Show second tab', width=200, height=30)
#表格框
tb=gui.TabBox(width='80%')
tb.append(b1, 'First')
b2=gui.Button('Show third tab', width=200, height=30)
#tb.add_tab(b2, 'Second', None)
tb.add_tab(b2, 'Second')
b3=gui.Button('Show first tab', width=200, height=30)
#tb.add_tab(b3, 'Third', None)
tb.add_tab(b3, 'Third')
#3種方法
b1.onclick.do(self.on_bt1_pressed, tb, b2)
b2.onclick.do(self.on_bt2_pressed, tb, 'Third')
b3.onclick.do(self.on_bt3_pressed, tb, 0)
return tb
#按鈕功能的定義,3種功能
def on_bt1_pressed(self, widget, tabbox, refWidgetTab):
tabbox.select_by_widget(refWidgetTab)
def on_bt2_pressed(self, widget, tabbox, refWidgetTabName):
tabbox.select_by_name(refWidgetTabName)
def on_bt3_pressed(self, widget, tabbox, tabIndex):
tabbox.select_by_index(tabIndex)
if __name__=="__main__":
#網(wǎng)頁(yè)標(biāo)題,standalone=False默認(rèn)是不允許
start(MyApp, title="Tab Demo=表格例子", standalone=False)
5.2 操作和效果圖:
6standalone:
======
6.1 代碼: mian.py
from remi import start, App
#將 bootstrap.py腳本放在本代碼mian.py同一個(gè)目錄下
from bootstrap import MyApp
if __name__=="__main__":
start(MyApp, standalone=True)
6.2 代碼:bootstrap.py=4.1所指定代碼:
6.3 注意啟動(dòng)網(wǎng)頁(yè)服務(wù)器默認(rèn)為不啟動(dòng)(false),需要啟動(dòng)則為standalone=True。
6.4 操作和效果圖:
把web網(wǎng)頁(yè)變成一個(gè)app的GUI
7 附一張gif:
代碼省略
===自己整理并分享===
喜歡的人,可以點(diǎn)贊、關(guān)注、評(píng)論、轉(zhuǎn)發(fā)和收藏。
Python提供的標(biāo)準(zhǔn)庫(kù)中有一個(gè)名為html的標(biāo)準(zhǔn)庫(kù),該標(biāo)準(zhǔn)庫(kù)提供的功能很簡(jiǎn)單,僅僅是把一些組成標(biāo)簽的尖括號(hào)或者是一些特殊字符轉(zhuǎn)換成實(shí)體字符。
這也是Python本身秉持的設(shè)計(jì)哲學(xué),就是一個(gè)函數(shù)、一個(gè)模塊或者一個(gè)標(biāo)準(zhǔn)庫(kù)只專注于一件事或者是某一方面的事。
我們先來(lái)大概了解該標(biāo)準(zhǔn)的組成
>>> import html
>>> dir(html)
['__all__', '__builtins__', '__cached__', '__doc__', '__file__', '__loader__', '__name__', '__package__', '__path__', '__spec__', '_charref', '_html5', '_invalid_charrefs', '_invalid_codepoints', '_re', '_replace_charref', 'entities', 'escape', 'unescape']
我們不管那些以_開頭的東東,把注意放在escape和unescape這兩個(gè)函數(shù)上。
假設(shè)我有一些HTML,我擔(dān)心其中會(huì)包含一些可能危險(xiǎn)的<script>標(biāo)記。這時(shí)有一種方法就是把標(biāo)簽的尖括號(hào)轉(zhuǎn)換成實(shí)體符號(hào),從以上兩個(gè)函數(shù)的命名可以大概了解相應(yīng)的功能。
沒(méi)錯(cuò)escape函數(shù)就是轉(zhuǎn)義的意思,就是把一些字符轉(zhuǎn)換為實(shí)體字符。比如“<”會(huì)轉(zhuǎn)換成“&+lt”、“>”會(huì)轉(zhuǎn)換成“&+gt”等等。(加號(hào)表示連接兩邊的符號(hào))
>>> import html
>>> help(html.escape)
Help on function escape in module html:
escape(s, quote=True)
Replace special characters "&", "<" and ">" to HTML-safe sequences.
If the optional flag quote is true (the default), the quotation mark
characters, both double quote (") and single quote (') characters are also
translated.
查看該函數(shù)的幫助可以了解到,它會(huì)把特定字符“&”,“<”,“>”等轉(zhuǎn)換成HTML安全的實(shí)體字符。該函數(shù)還有一個(gè)可選的標(biāo)記參數(shù),默認(rèn)為True,意思就是該函數(shù)默認(rèn)為把引用符號(hào)(“”、‘’)等一并轉(zhuǎn)換。
>>> import html
>>> demo="<h1>Hello World!,'</h1>"
>>> html.escape(demo,quote=False)
"<h1>Hello World!,'mangfu'</h1>"
上面的例子中,我設(shè)置可選參數(shù)quote為False,則它并不會(huì)對(duì)引號(hào)(‘’)進(jìn)行轉(zhuǎn)換。
>>> import html
>>> demo="<h1>Hello World!,'</h1>"
>>> html.escape(demo)
'<h1>Hello World!,'mangfu'</h1>'
上面的例子中,我使用該函數(shù)默認(rèn)的可選參數(shù),從結(jié)果中可以看出函數(shù)輸出已經(jīng)對(duì)引號(hào)(‘’)進(jìn)行轉(zhuǎn)換。
至于unescape函數(shù),看該函數(shù)的名字就知道它的作用跟escape函數(shù)恰恰相反。
可能大家對(duì)這些功能還不是很熟悉,但是這在Web開發(fā)方面是很重要的,如果你以后學(xué)習(xí)Django來(lái)搭建自己的網(wǎng)站,會(huì)碰到這個(gè)功能的。
大家可以動(dòng)手試試unescape函數(shù)。。。
在的爬蟲越來(lái)越難了,不再和之前的那樣,隨便抓個(gè)包就可以找到相關(guān)的 url ,然后 post 一下或者 get 一下數(shù)據(jù)就出來(lái)了。還有一個(gè)可能就是可能你以前用來(lái)學(xué)習(xí)的爬蟲網(wǎng)站太簡(jiǎn)單了,還沒(méi)有看見過(guò)那些猛的。上兩周我就想弄弄知乎登陸,參數(shù)的加密算是把 js 代碼扣出來(lái)了,但是只能在瀏覽器上運(yùn)行,一換到 Python 執(zhí)行就各種報(bào)錯(cuò),你不會(huì) JavaScript 就什么都調(diào)不了,所以二話不說(shuō),開啟了新的大陸。那就開始吧!
這是小編精心準(zhǔn)備的一份Python爬蟲入門學(xué)習(xí)資料,關(guān)注,轉(zhuǎn)發(fā),私信小編“01”即可免費(fèi)領(lǐng)取!
1. JavaScript 介紹
JavaScript 是運(yùn)行在 客戶端的語(yǔ)言,和你們說(shuō)的 Java 是很不一樣的, Java 通常用于服務(wù)器端的。但是他們兩者也有相似之處,比如 JavaScript 的命名規(guī)范和名稱和 Java 相似。其他的好像就沒(méi)有什么了,哈哈。
JavaScript 也是一門腳本語(yǔ)言,和 python 一樣,都是解釋性語(yǔ)言,即每運(yùn)行一行代碼就解釋一行,只不過(guò) JavaScript 的解釋器在瀏覽器內(nèi)部。
JavaScript 最初被應(yīng)用是為了處理與表單相關(guān)的驗(yàn)證,現(xiàn)在應(yīng)用就更加廣了,可以說(shuō)是幾乎無(wú)所不能,比如用來(lái)做服務(wù)端開發(fā),命令行工具、桌面程序和游戲開發(fā)等。
我在學(xué)了之后也跟著弄了兩個(gè)小的頁(yè)面游戲,懷念童年。
2.JavaScript組成
3.JavaScript 變量
在了解變量之前,先要知道 JavaScript 代碼寫在那里:
還有注釋:
3.1 變量的定義以及作用
變量是計(jì)算機(jī)內(nèi)存中存儲(chǔ)數(shù)據(jù)的標(biāo)識(shí)符,根據(jù)變量名稱可以獲取到內(nèi)存中存儲(chǔ)的數(shù)據(jù)。
使用變量我們可以更方便的獲取或修改內(nèi)存中的數(shù)據(jù)。
3.2 定義變量
使用 var 關(guān)鍵字來(lái)聲明變量,和 python 差不多,都是弱類型的語(yǔ)言,只不過(guò) python 不需要使用關(guān)鍵字來(lái)聲明。
注:console.log()這個(gè)方法只是在控制臺(tái)打印一下變量而已。
3.3 變量的命名規(guī)則和規(guī)范
1):規(guī)則-必須遵守的,不遵守就會(huì)報(bào)錯(cuò),就好比人類的法律
2):規(guī)范-建議遵守的,但不遵守也不會(huì)報(bào)錯(cuò),比如人類的道德
3.4 小案例
了解完變量之后可以做個(gè)小案例:交換兩個(gè)值
4. 數(shù)據(jù)類型
JavaScript 的數(shù)據(jù)類型分兩種,一個(gè)為簡(jiǎn)單數(shù)據(jù)類型,另一個(gè)為復(fù)雜數(shù)據(jù)類型。
簡(jiǎn)單數(shù)據(jù)類型有 Number、String、Boolean、undefined 和 null。一共五種
復(fù)雜數(shù)據(jù)類型比如 object,這個(gè)以后遇到再說(shuō),慢慢來(lái)。
4.1 Number
Number 為數(shù)值固定的表示法,用來(lái)表示整數(shù)和浮點(diǎn)數(shù)的。它的字面量就是數(shù)值,那字面量是什么意思呢?字面量就是這個(gè)變量表示的值,
比如上面變量 a 的字面量就是 12,b 的字面量就是 45。
我們還可以使用 typeof 關(guān)鍵字來(lái)判斷這個(gè)數(shù)據(jù)類型
除了使用上面的十進(jìn)制來(lái)賦值,我們還可以使用八進(jìn)制和十六進(jìn)制
八進(jìn)制的數(shù)是以 0 開頭的,而十六進(jìn)制的是以 0x 開頭的,其他的進(jìn)制就不討論了。
無(wú)論你寫何種進(jìn)制,它的存儲(chǔ)還是以二進(jìn)制來(lái)存儲(chǔ)的,所以這樣就弄成了浮點(diǎn)數(shù)的存儲(chǔ)精確度,浮點(diǎn)數(shù)只能精確到17位小數(shù)。
可以看到 兩個(gè)浮點(diǎn)數(shù)的相加不是很準(zhǔn)確,所以不要在有浮點(diǎn)數(shù)的運(yùn)算下做判斷,有可能會(huì)有你想不到的結(jié)果,如
浮點(diǎn)數(shù)除了直接表示我們還可以使用科學(xué)計(jì)數(shù)法,當(dāng)然,整數(shù)也是一樣可以使用的。
Number 數(shù)據(jù)類型是有范圍的,但是不需要我們刻意去計(jì),記住它的關(guān)鍵字就可以了。
最后再說(shuō)一個(gè)關(guān)鍵字:NaN:not a number,這個(gè)表示不是數(shù)值,當(dāng)有兩個(gè)數(shù)據(jù)運(yùn)算時(shí),運(yùn)算失敗就會(huì)返回這個(gè)值。我們也可以判斷一個(gè)數(shù)據(jù)類型是不是 NaN,使用 isNaN() 方法即可。
4.2 String
String 類型就是用單引號(hào)或雙引號(hào)括起來(lái)的內(nèi)容就是了,和 python 的字符串類型也是差不多的。
length 屬性是獲取字符串的長(zhǎng)度。
連接兩個(gè)字符串可以使用 + 進(jìn)行連接, + 號(hào)兩邊不需要全是 String 類型也可以進(jìn)行連接
思考:如何打印出下列字符串
這里面有單引號(hào)和雙引號(hào),如果直接進(jìn)行打印的話就會(huì)出錯(cuò),這時(shí)候我們就需要把這些有意義的字符給轉(zhuǎn)義符,轉(zhuǎn)成普通的字符
根據(jù)上面的轉(zhuǎn)義符,就可以寫出下面語(yǔ)句了
4.3 Boolean
boolean 類型,字面量只有 true 和 false,表示真假,即表示計(jì)算機(jī)的 1 和 0。
當(dāng)我們描述只有兩種結(jié)果的事物是可以使用這個(gè)。
4.4 undefined 和 null
5. 數(shù)據(jù)類型轉(zhuǎn)換
5.1 其他類型轉(zhuǎn) String 類型
需要注意:undefined 和 null 類型不能使用這個(gè)方法
5.2 其他類型轉(zhuǎn) Number 類型
5.3 其他類型轉(zhuǎn) Boolean 類型
這個(gè)使用 Boolean() 來(lái)轉(zhuǎn)就可以了,所有類型都可以轉(zhuǎn)。轉(zhuǎn)為 false 的情況為 null、undefined、NaN、0 和 空字符串,其他情況均為 true。
其實(shí)這個(gè)還可以使用隱式轉(zhuǎn)換,就是不需要自己手動(dòng)轉(zhuǎn),解釋器會(huì)自動(dòng)幫我們轉(zhuǎn),隱式轉(zhuǎn)換通常用在判斷語(yǔ)句的情況,隱式轉(zhuǎn)換可以減少代碼的書寫,等說(shuō)到判斷語(yǔ)句再說(shuō),下面就有!
6. 操作符
操作符就是用來(lái)對(duì)數(shù)據(jù)類型進(jìn)行操作的符號(hào),每個(gè)語(yǔ)言的操作符都差不多,這里再說(shuō)下可以更深刻一點(diǎn)!
6.1 算術(shù)運(yùn)算符
有 + - * / % 五個(gè),任何一個(gè)數(shù) 除 0 都為為無(wú)窮大,模 0 為 NaN
6.2 一元運(yùn)算符
一元運(yùn)算符就是只需要一個(gè)操作數(shù)的運(yùn)算符,有 ++、-- 和 !
還有 -- 也是一樣的,只是 它是自身減 1,在運(yùn)算中需要注意變量在一元運(yùn)算符的順序。
6.3 邏輯運(yùn)算符
邏輯運(yùn)算符有 && 、|| 和 !,! 因?yàn)橹粚?duì)一個(gè)操作數(shù)操作所以也屬于一元運(yùn)算符。
6.4 關(guān)系運(yùn)算符
關(guān)系運(yùn)算符有 < > <=>===!====和 !==。運(yùn)算完都是返回 Boolean 類型的,這里就不細(xì)說(shuō)了,都差不多的,只說(shuō)下==和===的區(qū)別,還有 !==和 !=的區(qū)別。==只判斷兩值的字面量相等不相等,不會(huì)判斷數(shù)據(jù)類型,而===會(huì)先去判斷數(shù)據(jù)類型再判斷字面量,!=和 !==的區(qū)別也是這樣。
6.5 賦值運(yùn)算符
賦值運(yùn)算符有 +=-=*=/=%== 六個(gè)。
+=就是把左右兩邊的值相加起來(lái)再賦值給左邊的值,其他的也一樣,就不多說(shuō)了。
6.6 運(yùn)算符優(yōu)先級(jí)從高到低(運(yùn)算順序)
7. 流程結(jié)構(gòu)
JavaScript 的流程結(jié)構(gòu)有三種,分別是順序結(jié)構(gòu),分支結(jié)構(gòu)和循環(huán)結(jié)構(gòu),這個(gè)也和 python 差不多的。
順序結(jié)構(gòu)就是代碼是按順序從上到下執(zhí)行的,分支結(jié)構(gòu)就是按照給定條件的是否成立而執(zhí)行不同的語(yǔ)句,循環(huán)結(jié)構(gòu)就是重復(fù)執(zhí)行某一段代碼。
順序結(jié)構(gòu)就不多說(shuō)了,我們剛才運(yùn)行的代碼就是順序結(jié)構(gòu)的,現(xiàn)在先說(shuō)下分支結(jié)構(gòu)。
7.1 分支結(jié)構(gòu)
使用分支結(jié)構(gòu)可以使用 if 和 else 組成的語(yǔ)句,寫法和 python 差不多。
單獨(dú) if 語(yǔ)句
說(shuō)到判斷,就有個(gè)隱式轉(zhuǎn)換,就是 if 括號(hào)里面的值會(huì)將任意類型的值隱式轉(zhuǎn)換成 Boolean 類型。如下:
另一種形式的分支語(yǔ)句:
if-else 一起用
這個(gè) if-else 合用還有個(gè)簡(jiǎn)單點(diǎn)的寫法,叫做三元運(yùn)算符,語(yǔ)法為
當(dāng)表達(dá)式1 為 true 的時(shí)候,就會(huì)把 表達(dá)式2 的值給返回,否則返回 表達(dá)式3 的值,這個(gè)有一個(gè)缺陷,就是必須要有結(jié)果返回。
還有一種形式的分支語(yǔ)句:
if-else if-if 三個(gè)合用
上面的 三個(gè)合用我們也可以使用 switch 語(yǔ)句來(lái)改寫,這個(gè)是選擇關(guān)鍵詞。語(yǔ)法為
改寫后:
因?yàn)?case 的值只能是一個(gè)值,不能是范圍,所以用了個(gè)除法來(lái)解決,要不然需要寫大量的 case,還需要注意一點(diǎn)是一定需要記得寫 break,否則在匹配到相應(yīng)的值之后它會(huì)一直往下運(yùn)行不管 case 值是否對(duì)應(yīng),直到遇到 break 或者 全部運(yùn)行完。
7.2 循環(huán)結(jié)構(gòu)
JavaScript 的循環(huán)結(jié)構(gòu)也有 while 和 for語(yǔ)句,但他還有 do-while語(yǔ)句。
這個(gè)先去執(zhí)行初始化表達(dá)式1, 然后去執(zhí)行判斷表達(dá)式2,符合條件就會(huì)執(zhí)行循環(huán)體,循環(huán)體執(zhí)行完之后就執(zhí)行自增表達(dá)式3,再去判斷,接下來(lái)就是重復(fù)剛才的動(dòng)作,直到不滿足判斷表達(dá)式2。
滿足循環(huán)條件之后就執(zhí)行循環(huán)體,然后再去執(zhí)行循環(huán)條件,接下來(lái)就是重復(fù)剛才的動(dòng)作直到不滿足條件。
先去執(zhí)行循環(huán)體,再去判斷循環(huán)條件,接下來(lái)就是重復(fù)剛才的動(dòng)作直到循環(huán)條件不滿足。
在循環(huán)結(jié)構(gòu)中還可以使用 break 和 continue 來(lái)對(duì)循環(huán)進(jìn)行跳出的操作。break 就是跳出整個(gè)循環(huán),就是循環(huán)結(jié)束,而 continue 是跳出本次循環(huán),接著下一次的循環(huán)。
學(xué)習(xí)了循環(huán)之后,我們也可以嘗試著自己打印一個(gè)三角形,或者 99 乘法表來(lái)滿足一下自己。
這兩個(gè)的思路都是差不多的,只要你搞定了第一個(gè)三角形的思路,下面的乘法表自然就迎刃而解了,這里就不多說(shuō)了
*請(qǐng)認(rèn)真填寫需求信息,我們會(huì)在24小時(shí)內(nèi)與您取得聯(lián)系。