《Python指南》學習筆記 一

来源:https://www.cnblogs.com/liycode/archive/2018/07/15/9315118.html
-Advertisement-
Play Games

更新時間:2018 06 14 《Python指南》原文在 "這裡" 。本篇筆記主要是劃重點。 Python 3.6.3 1、簡單入門 1.1 編碼 預設情況下,Python 源文件是 UTF 8 編碼。 你也可以為源文件指定不同的字元編碼。 1.2 註釋 Python 中的註釋以 字元起始,直至實 ...


更新時間:2018-06-14

《Python指南》原文在這裡。本篇筆記主要是劃重點。

Python 3.6.3

1、簡單入門

1.1 編碼

預設情況下,Python 源文件是 UTF-8 編碼。


你也可以為源文件指定不同的字元編碼。

# -*- coding: encoding -*-

1.2 註釋

Python 中的註釋以 # 字元起始,直至實際的行尾。類似java的//單行註釋

1.3 算術運算

整數的類型是int,浮點數的類型是float。整數和浮點數的混合計算中,整數會被轉換為浮點數。

除法(/)永遠返回一個浮點數。

floor除法(//)並且得到整數結果(丟掉任何小數部分)。

%用來計算餘數。

**運算符計算冪乘方。

5 ** 2 # 5的2次方,結果是25

變數在使用前必須 “定義”(賦值)。

除了 intfloat,Python 還支持其它數字類型,例如 DecimalFraction

1.4 字元串

Python提供了幾種不同方式表示的字元串。它們可以用單引號 ('...') 或雙引號 ("...") 標識。\ 可以用來轉義引號。

當字元中帶有\時可能會出現錯誤,例如\n會換行。你可以使用 原始字元串,方法是在第一個引號前面加上一個 r

>>> print(r'C:\some\name')
C:\some\name

字元串文本能夠分成多行。一種方法是使用三引號:"""...""" 或者 '''...'''

行尾換行符會被自動包含到字元串中,但是可以在行尾加上 \ 來避免這個行為。下麵的示例: 可以使用反斜杠為行結尾的連續字元串,它表示下一行在邏輯上是本行的後續內容:

print("""\
Usage: thingy [OPTIONS]
     -h                        Display this usage message
     -H hostname               Hostname to connect to
""")

將輸出以下內容:

Usage: thingy [OPTIONS]
     -h                        Display this usage message
     -H hostname               Hostname to connect to

字元串可以由 + 操作符連接(粘到一起),可以由 * 表示重覆:

>>> 3 * 'un' + 'ium'
'unununium'

相鄰的兩個字元串文本自動連接在一起:

>>> 'Py' 'thon'
'Python'

它只用於兩個字元串文本,不能用於字元串表達式:

>>> prefix = 'Py'
>>> prefix 'thon'
  ...
SyntaxError: invalid syntax
>>> ('un' * 3) 'ium'
  ...
SyntaxError: invalid syntax

字元串也可以被截取(檢索)。字元串的第一個字元索引為 0 。Python沒有單獨的字元類型;一個字元就是一個簡單的長度為1的字元串。:

>>> word = 'Python'
>>> word[0]  # 獲取索引為0的字元
'P'

索引也可以是負數,這將導致從右邊開始計算。例如:

>>> word = 'Python'
>>> word[-1]
'n'

請註意 -0 實際上就是 0。

除了索引,還支持 切片。索引用於獲得單個字元,切片 讓你獲得一個子字元串:

>>> word = 'Python'
>>> word[0:2] # 截取索引從0開始到1(2的前一位)的字元串
'Py'

切片的索引有非常有用的預設值;省略的第一個索引預設為零,省略的第二個索引預設為切片的字元串的大小。

>>> word = 'Python'
>>> word[:2]
'Py'
>>> word[4:]
'on'

試圖使用太大的索引會導致錯誤:

IndexError: string index out of range

Python 能夠優雅地處理那些沒有意義的切片索引:一個過大的索引值(即下標值大於字元串實際長度)將被字元串實際長度所代替,當上邊界比下邊界大時(即切片左值大於右值)就返回空字元串。

>>> word = 'Python'
>>> word[4:42]
'on'
>>> word[42:]
''

Python字元串不可以被更改 — 它們是不可變的。因此,賦值給字元串索引的位置會導致錯誤:

>>> word[0] = 'J'
  ...
TypeError: 'str' object does not support item assignment

內置函數 len() 返回字元串長度:

>>> s = 'supercalifragilisticexpialidoc'
>>> len(s)
30

1.5 列表(list)

Python 有幾個複合數據類型,用於表示其它的值。最通用的是list,它可以寫作中括弧之間的一列逗號分隔的值。列表的元素不必是同一類型。

>>> squares = [1, 4, 9, 16, 25]
>>> squares
[1, 4, 9, 16, 25]

就像字元串(以及其它所有內建的 序列 類型)一樣,列表可以被索引和切片:

>>> squares[0]
1
>>> squares[-1]
25
>>> squares[-3:]  # 切片返回一個新list(淺拷貝)
[9, 16, 25]

列表也支持連接這樣的操作:

>>> squares + [36, 49, 64, 81, 100]
[1, 4, 9, 16, 25, 36, 49, 64, 81, 100]

你還可以使用 append() 方法在列表的末尾添加新的元素:

>>> cubes = [1, 8, 27, 65, 125]
>>> cubes.append(216)
>>> cubes.append(7 ** 3)
>>> cubes
[1, 8, 27, 64, 125, 216, 343]

也可以對切片賦值,此操作可以改變列表的尺寸,或清空它:

>>> letters = ['a', 'b', 'c', 'd', 'e', 'f', 'g']
>>> letters[2:5] = ['C', 'D', 'E']
>>> letters
['a', 'b', 'C', 'D', 'E', 'f', 'g']

>>> letters[2:5] = []
>>> letters
['a', 'b', 'f', 'g']

>>> # 清空list
>>> letters[:] = []
>>> letters
[]

內置函數 len() 同樣適用於列表:

>>> letters = ['a', 'b', 'c', 'd']
>>> len(letters)
4

允許嵌套列表:

>>> a = ['a', 'b', 'c']
>>> n = [1, 2, 3]
>>> x = [a, n]
>>> x
[['a', 'b', 'c'], [1, 2, 3]]
>>> x[0]
['a', 'b', 'c']
>>> x[0][1]
'b'

1.6 更複雜的例子

例如,我們可以寫一個生成菲波那契子序列的程式,如下所示:

>>> # Fibonacci series:
... a, b = 0, 1
>>> while b < 10:
...     print(b)
...     a, b = b, a+b

這個例子介紹了幾個新功能。

  • 第一行包括了一個 多重賦值:變數 ab 同時獲得了新的值 0 和 1 最後一行又使用了一次。
  • 條件(這裡是 b < 10 )為 true 時, while 迴圈執行。在 Python 中,類似於 C,任何非零整數都是 true;0 是 false。條件也可以是字元串或列表,實際上可以是任何序列;所有長度不為零的是 true,空序列是 false
  • 迴圈體是縮進的:縮進是 Python 組織語句的方法。Python (還)不提供集成的行編輯功能,所以你要為每一個縮進行輸入 TAB 或空格。
  • 互動式錄入複合語句時,必須在最後輸入一個空行來標識結束(因為解釋器沒辦法猜測你輸入的哪一行是最後一行),需要 註意的是同一個語句塊中的每一行必須縮進同樣數量的空白。
  • 關鍵字 print() 語句輸出給定表達式的值。

用一個逗號結尾就可以禁止輸出換行:

>>> a, b = 0, 1
>>> while b < 1000:
...     print(b, end=',')
...     a, b = b, a+b
...
1,1,2,3,5,8,13,21,34,55,89,144,233,377,610,987,

2、深入 Python 流程式控制制

2.1 if 語句

>>> x = int(input("Please enter an integer: "))
Please enter an integer: 42
>>> if x < 0:
...      x = 0
...      print('Negative changed to zero')
... elif x == 0:
...      print('Zero')
... elif x == 1:
...      print('Single')
... else:
...      print('More')

可能會有零到多個 elif 部分,else 是可選的。

2.2 for 語句

Python 的 for 語句可以依據任意序列(鏈表或字元串)中的子項,按它們在序列中的順序來進行迭代。

>>> # Measure some strings:
... words = ['cat', 'window', 'defenestrate']
>>> for w in words:
...     print(w, len(w))
...
cat 3
window 6
defenestrate 12

在迭代過程中修改迭代序列不安全(只有在使用鏈表這樣的可變序列時才會有這樣的情況)。如果你想要修改你迭代的序列(例如,複製選擇項),你可以迭代它的複本。使用切割標識就可以很方便的做到這一點:

>>> for w in words[:]:  # 迴圈一個完整的 list副本
...     if len(w) > 6:
...         words.insert(0, w)
...
>>> words
['defenestrate', 'cat', 'window', 'defenestrate']

2.3. range() 函數

如果你需要一個數值序列,內置函數 range() 會很方便,它生成一個等差級數鏈表:

>>> for i in range(5):
...     print(i)
...
0
1
2
3
4

range(10) 生成了一個包含 10 個值的鏈表,它用鏈表的索引值填充了這個長度為 10 的列表,所生成的鏈表中不包括範圍中的結束值。也可以讓 range() 操作從另一個數值開始,或者可以指定一個不同的步進值(甚至是負數,有時這也被稱為 “步長”):

range(5, 10)
   5 到 9

range(0, 10, 3)// (從幾開始,到幾,每次增加多少)
   0, 3, 6, 9

range(-10, -100, -30)
  -10, -40, -70

需要迭代鏈表索引的話,如下所示結合使 用 range()len()

>>> a = ['Mary', 'had', 'a', 'little', 'lamb']
>>> for i in range(len(a)):
...     print(i, a[i])
...
0 Mary
1 had
2 a
3 little
4 lamb

不過,這種場合可以方便的使用 enumerate():

>>> for i, v in enumerate(['tic', 'tac', 'toe']):
...     print(i, v)
...
0 tic
1 tac
2 toe

如果你只是列印一個序列的話會發生奇怪的事情:

>>> print(range(10))
range(0, 10)

在不同方面 range() 函數返回的對象表現為它是一個列表,但事實上它並不是。當你迭代它時,它是一個能夠像期望的序列返回連續項的對象;但為了節省空間,它並不真正構造列表。

我們稱此類對象是 可迭代的,即適合作為那些期望從某些東西中獲得連續項直到結束的函數或結構的一個目標(參數)。我們已經見過的 for 語句就是這樣一個迭代器。list() 函數是另外一個( 迭代器 ),它從可迭代(對象)中創建列表:

>>> list(range(5))
[0, 1, 2, 3, 4]

2.4. break 和 continue 語句, 以及迴圈中的 else 子句

迴圈可以有一個 else 子句;它在迴圈迭代完整個列表(對於 for )或執行條件為 false (對於 while )時執行,但迴圈被 break 中止的情況下不會執行。以下搜索素數的示常式序演示了這個子句:

>>> for n in range(2, 10):
...     for x in range(2, n):
...         if n % x == 0:
...             print(n, 'equals', x, '*', n//x)
...             break
...     else:
...         # loop fell through without finding a factor
...         print(n, 'is a prime number')
...
2 is a prime number
3 is a prime number
4 equals 2 * 2
5 is a prime number
6 equals 2 * 3
7 is a prime number
8 equals 2 * 4
9 equals 3 * 3

2.5. pass 語句

pass 語句什麼也不做。它用於那些語法上必須要有什麼語句,但程式什麼也不做的場合,例如:

>>> while True:
...     pass  # Busy-wait for keyboard interrupt (Ctrl+C)
...

2.6. 定義函數

我們可以創建一個用來生成指定邊界的斐波那契數列的函數:

>>> def fib(n):
...     """Print a Fibonacci series up to n."""
...     a, b = 0, 1
...     while a < n:
...         print(a, end=' ')
...         a, b = b, a+b
...     print()
...
>>> # Now call the function we just defined:
... fib(2000)
0 1 1 2 3 5 8 13 21 34 55 89 144 233 377 610 987 1597

關鍵字 def 引入了一個函數 定義。在其後必須跟有函數名和包括形式參數的圓括弧。函數體語句從下一行開始,必須是縮進的。

函數體的第一行語句可以是可選的字元串文本,這個字元串是函數的文檔字元串,或者稱為 docstring。在你的代碼中包含 docstrings 是一個好的實踐,讓它成為習慣吧。

函數 調用 會為函數局部變數生成一個新的符號表。確切的說,所有函數中的變數賦值都是將值存儲在局部符號表。變數引用首先在局部符號表中查找,然後是包含函數的局部符號表,然後是全局符號表,最後是內置名字表。因此,全局變數不能在函數中直接賦值(除非用 global 語句命名),儘管他們可以被引用。

函數引用的實際參數在函數調用時引入局部符號表,因此,實參總是 傳值調用 (這裡的 值 總是一個對象 引用 ,而不是該對象的值)。[1] 一個函數被另一個函數調用時,一個新的局部符號表在調用過程中被創建。

一個函數定義會在當前符號表內引入函數名。函數名指代的值(即函數體)有一個被 Python 解釋器認定為 用戶自定義函數 的類型。 這個值可以賦予其他的名字(即變數名),然後它也可以被當做函數使用。這可以作為通用的重命名機制:

>>> fib
<function fib at 10042ed0>
>>> f = fib
>>> f(100)
0 1 1 2 3 5 8 13 21 34 55 89

如果你使用過其他語言,你可能會反對說:fib 不是一個函數,而是一個方法,因為它並不返回任何值。事實上,沒有 return 語句的函數確實會返回一個值,雖然是一個相當令人厭煩的值(指 None )。這個值被稱為 None (這是一個內建名稱)。如果 None 值是唯一被書寫的值,那麼在寫的時候通常會被解釋器忽略(即不輸出任何內容)。如果你確實想看到這個值的輸出內容,請使用 print() 函數:

>>> fib(0)
>>> print(fib(0))
None

定義一個返回斐波那契數列數字列表的函數,而不是列印它,是很簡單的:

>>> def fib2(n):
...     """Return a list containing the Fibonacci series up to n."""
...     result = []
...     a, b = 0, 1
...     while a < n:
...         result.append(a)
...         a, b = b, a+b
...     return result
...
>>> f100 = fib2(100)
>>> f100
[0, 1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89]

return 語句從函數中返回一個值,不帶表達式的 return 返回 None

2.7. 深入 Python 函數定義

2.7.1. 預設參數值

最常用的一種形式是為一個或多個參數指定預設值。再使用時有預設值的參數就可以不傳。

def ask_ok(prompt, retries=4, complaint='Yes or no, please!'):
    while True:
        ok = input(prompt)
        if ok in ('y', 'ye', 'yes'):
            return True
        if ok in ('n', 'no', 'nop', 'nope'):
            return False
        retries = retries - 1
        if retries < 0:
            raise OSError('uncooperative user')
        print(complaint)

這個函數可以通過幾種不同的方式調用:

只給出必要的參數:

ask_ok('Do you really want to quit?')

給出一個可選的參數:

ask_ok('OK to overwrite the file?', 2)

或者給出所有的參數:

ask_ok('OK to overwrite the file?', 2, 'Come on, only yes or no!')

這個例子還介紹了 in 關鍵字。它測定序列中是否包含某個確定的值。

預設值在函數 定義 作用域被解析,如下所示:

i = 5

def f(arg=i):
    print(arg)

i = 6
f()

將會輸出 5。

重要警告: 預設值只被賦值一次。當預設值是可變對象時會有所不同,比如列表、字典或者大多數類的實例。例如,下麵的函數在後續調用過程中會累積(前面)傳給它的參數:

def f(a, L=[]):
    L.append(a)
    return L

print(f(1))
print(f(2))
print(f(3))

這將會輸出:

[1]
[1, 2]
[1, 2, 3]

如果你不想讓預設值在後續調用中累積,你可以像下麵一樣定義函數:

def f(a, L=None):
    if L is None:
        L = []
    L.append(a)
    return L

2.7.2. 關鍵字參數

函數可以通過 關鍵字參數 的形式來調用,形如 keyword = value。例如,以下的函數:

def parrot(voltage, state='a stiff', action='voom', type='Norwegian Blue'):
    print("-- This parrot wouldn't", action, end=' ')
    print("if you put", voltage, "volts through it.")
    print("-- Lovely plumage, the", type)
    print("-- It's", state, "!")

接受一個必選參數 (voltage) 以及三個可選參數 (state, action, 和 type)。可以用以下的任一方法調用:

parrot(1000)
parrot(voltage=1000)
parrot(voltage=1000000, action='VOOOOOM')
parrot(action='VOOOOOM', voltage=1000000)
parrot('a million', 'bereft of life', 'jump')
parrot('a thousand', state='pushing up the daisies')

任何參數都不可以多次賦值。下麵的示例由於這種限制將失敗:

>>> def function(a):
...     pass
...
>>> function(0, a=0)
Traceback (most recent call last):
  File "<stdin>", line 1, in ?
TypeError: function() got multiple values for keyword argument 'a'

引入一個形如 **name 的參數時,它接收一個字典(參見 Mapping Types — dict ),該字典包含了所有未出現在形式參數列表中的關鍵字參數。這裡可能還會組合使用一個形如 *name (下一小節詳細介紹) 的形式參數,它接收一個元組(下一節中會詳細介紹),包含了所有沒有出現在形式參數列表中的參數值( *name 必須在 **name 之前出現)。 例如,我們這樣定義一個函數:

def cheeseshop(kind, *arguments, **keywords):
    print("-- Do you have any", kind, "?")
    print("-- I'm sorry, we're all out of", kind)
    for arg in arguments:
        print(arg)
    print("-" * 40)
    keys = sorted(keywords.keys())
    for kw in keys:
        print(kw, ":", keywords[kw])

它可以像這樣調用:

cheeseshop("Limburger", "It's very runny, sir.",
           "It's really very, VERY runny, sir.",
           shopkeeper="Michael Palin",
           client="John Cleese",
           sketch="Cheese Shop Sketch")

當然它會按如下內容列印:

-- Do you have any Limburger ?
-- I'm sorry, we're all out of Limburger
It's very runny, sir.
It's really very, VERY runny, sir.
----------------------------------------
client : John Cleese
shopkeeper : Michael Palin
sketch : Cheese Shop Sketch

註意在列印關鍵字參數之前,通過對關鍵字字典 keys() 方法的結果進行排序,生成了關鍵字參數名的列表;如果不這樣做,列印出來的參數的順序是未定義的。

2.7.3. 參數列表的分拆

當你要傳遞的參數已經是一個列表,但要調用的函數卻接受分開一個個的參數值。這時候你要把已有的列表拆開來。例如內建函數 range() 需要要獨立的 start,stop 參數。你可以在調用函數時加一個 * 操作符來自動把參數列表拆開:

>>> list(range(3, 6))   # 直接使用獨立參數
[3, 4, 5]
>>> args = [3, 6]
>>> list(range(*args))  # 從一個list里拆分參數
[3, 4, 5]

以同樣的方式,可以使用 ** 操作符分拆關鍵字參數為字典:

>>> def parrot(voltage, state='a stiff', action='voom'):
...     print("-- This parrot wouldn't", action, end=' ')
...     print("if you put", voltage, "volts through it.", end=' ')
...     print("E's", state, "!")
...
>>> d = {"voltage": "four million", "state": "bleedin' demised", "action": "VOOM"}
>>> parrot(**d)
-- This parrot wouldn't VOOM if you put four million volts through it. E's bleedin' demised !

2.7.4. Lambda 形式

通過 lambda 關鍵字,可以創建短小的匿名函數。這裡有一個函數返回它的兩個參數的和: lambda a, b: a+b。 Lambda 形式可以用於任何需要的函數對象。出於語法限制,它們只能有一個單獨的表達式。語義上講,它們只是普通函數定義中的一個語法技巧。類似於嵌套函數定義,lambda 形式可以從外部作用域引用變數:

>>> def make_incrementor(n):
...     return lambda x: x + n
...
>>> f = make_incrementor(42)
>>> f(0)
42
>>> f(1)
43

2.8. 編碼風格

1.使用 4 空格縮進,而非 TAB

在小縮進(可以嵌套更深)和大縮進(更易讀)之間,4空格是一個很好的折中。TAB 引發了一些混亂,最好棄用

2.折行以確保其不會超過 79 個字元

這有助於小顯示器用戶閱讀,也可以讓大顯示器能併排顯示幾個代碼文件

3.使用空行分隔函數和類,以及函數中的大塊代碼

4.可能的話,註釋獨占一行

5.統一函數和類命名

推薦類名用 駝峰命名, 函數和方法名用 小寫和_下劃線。總是用self` 作為方法的第一個參數


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • html的每一個標簽都共有的屬性有'id','class','style' ...
  • 一、Hbernate中的日誌框架_整合log4j(瞭解) Hibernate 利用 Simple Logging Facade for Java (SLF4J)來記錄不同系統事件的日誌。SLF4J 可以根據你選擇的綁定把日誌輸出到幾個日誌框架(NOP、Simple、log4j version1.2、 ...
  • 問題描述: 在activemq的監聽器中,通過註解@Autowired或@Resource註入bean時,獲取到的bean為null。調用該bean的方法時會報空指針異常。 問題原因: 當調用bean內方法時,spring容器中還沒有完成對註解bean的掃描,dispatcher.xml中配置的註解 ...
  • 實現對DataFrame對象隨機採樣 pandas是基於numpy建立起來的,所以numpy大部分函數可作用於DataFrame和Series數據結構。 numpy.random.permutation(n)函數可以產生0~n範圍內的n個隨機數,輸出形式為numpy數組。 In: Out: 新建一個 ...
  • 1、java中的scanner: scanner 是java中用來進行人機交互的函數; 使用前需要導入:java.util.Scanner包 import java.util.Scanner; 在使用時有以下語法: Scanner sc=new Scanner(System.in);//建立一個鍵盤 ...
  • 想了很久,我決定還是先從signal和slot(信號槽)開始講起。 signal和slot大家一定不陌生,先看一段示例(選自文檔): 使用signal和slot的類必須包含Q_OBJECT巨集,聲明slot需要使用public/private/protected slots:,signal則需要sig ...
  • 直接上代碼,先來個爬取豆瓣圖片的,大致思路就是發送請求-得到響應數據-儲存數據,原理的話可以先看看這個 https://www.cnblogs.com/sss4/p/7809821.html 再來個爬去標題類的 這個是下載小說的 (別人的代碼) ...
  • 字典: key值經過哈希函數的運算的結果決定value存放的地址,且key值是由不可變數組成。value可以是任何python的對象。 字典基本操作 增 查 刪 排 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...