主頁 > 後端開發 > 你應該知道的Python3.6、3.7、3.8新特性

你應該知道的Python3.6、3.7、3.8新特性

2020-10-02 04:41:38 後端開發

很多人在學習了基本的Python語言知識后,就轉入應用階段了,后期很少對語言本身的新變化、新內容進行跟蹤學習和知識更新,甚至連已經發布了好幾年的Python3.6的新特性都缺乏了解,

本文列舉了Python3.6、3.7、3.8三個版本的新特性,學習它們有助于提高對Python的了解,跟上最新的潮流,

一、Python3.6新特性

1、新的格式化字串方式

新的格式化字串方式,即在普通字串前添加 fF 前綴,其效果類似于str.format(),比如

name = "red"
print(f"He said his name is {name}.") 
# 'He said his name is red.'

相當于:

print("He said his name is {name}.".format(**locals()))

此外,此特性還支持嵌套欄位,比如:

import decimal
width = 10
precision = 4
value = https://www.cnblogs.com/django-dev/p/decimal.Decimal("12.34567")
print(f"result: {value:{width}.{precision}}") 
#'result:  12.35'

2、變數宣告語法

可以像下面一樣宣告一個變數并指定型別:

from typing import List, Dict
 
primes: List[int] = []
captain: str  # 此時沒有初始值
 
class Starship:
  stats: Dict[str, int] = {}

3、數字的下劃線寫法

允許在數字中使用下劃線,以提高多位數字的可讀性,

a = 1_000_000_000_000_000    # 1000000000000000
b = 0x_FF_FF_FF_FF       # 4294967295

除此之外,字串格式化也支持_選項,以列印出更易讀的數字字串:

'{:_}'.format(1000000)     # '1_000_000'
'{:_x}'.format(0xFFFFFFFF)   # 'ffff_ffff'

4、異步生成器

在Python3.5中,引入了新的語法 async 和 await 來實作協同程式,但是有個限制,不能在同一個函式體內同時使用 yield 和 await,Python3.6中,這個限制被放開了,允許定義異步生成器:

async def ticker(delay, to):
"""Yield numbers from 0 to *to* every *delay* seconds."""
  for i in range(to):
    yield i
    await asyncio.sleep(delay)

5、異步決議器

允許在串列list、集合set 和字典dict 決議器中使用 async 或 await 語法,

result = [i async for i in aiter() if i % 2]
result = [await fun() for fun in funcs if await condition()]

6、新增加模塊

標準庫(The Standard Library)中增加了一個新的模塊:secrets,該模塊用來生成一些安全性更高的亂數,用于管理passwords, account authentication, security tokens, 以及related secrets等資料,

7、其他新特性

  • 新的 PYTHONMALLOC 環境變數允許開發者設定記憶體分配器,以及注冊debug鉤子等,
  • asyncio模塊更加穩定、高效,并且不再是臨時模塊,其中的API也都是穩定版的了,
  • typing模塊也有了一定改進,并且不再是臨時模塊,
  • datetime.strftime 和 date.strftime 開始支持ISO 8601的時間識別符號%G, %u, %V,
  • hashlib 和 ssl 模塊開始支持OpenSSL1.1.0,
  • hashlib模塊開始支持新的hash演算法,比如BLAKE2, SHA-3 和 SHAKE,
  • Windows上的 filesystem 和 console 默認編碼改為UTF-8,
  • json模塊中的 json.load() 和 json.loads() 函式開始支持 binary 型別輸入,

更多內容參考官方檔案:What's New In Python 3.6

二、Python3.7新特性

Python 3.7于2018年6月27日發布, 包含許多新特性和優化,增添了眾多新的類,可用于資料處理、針對腳本編譯和垃圾收集的優化以及更快的異步I/O,主要如下:

  • 用類處理資料時減少樣板代碼的資料類,
  • 一處可能無法向后兼容的變更涉及處理生成器中的例外,
  • 面向解釋器的“開發模式”,
  • 具有納秒解析度的時間物件,
  • 環境中默認使用UTF-8編碼的UTF-8模式,
  • 觸發除錯器的一個新的內置函式,

1、新增內置函式breakpoint()

使用該內置函式,相當于通過代碼的方式設定了斷點,會自動進入Pbd除錯模式,

如果在環境變數中設定PYTHONBREAKPOINT=0會忽略此函式,并且,pdb 只是眾多可用除錯器之一,你可以通過設定新的 PYTHONBREAKPOINT 環境變數來配置想要使用的除錯器,

下面有一個簡單例子,用戶需要輸入一個數字,判斷它是否和目標數字一樣:

"""猜數字游戲"""

def guess(target):
    user_guess = input("請輸入你猜的數 >>> ")
    if user_guess == target:
        return "你猜對了!"
    else:
        return "猜錯了"


if __name__ == '__main__':
    a = 100
    print(guess(a))

不幸的是,即使猜的數和目標數一樣,列印的結果也是‘猜錯了’,并且沒有任何例外或錯誤資訊,

為了弄清楚發生了什么,我們可以插入一個斷點,來除錯一下,以往一般通過print大法或者IDE的除錯工具,但現在我們可以使用 breakpoint()

"""猜數字游戲"""


def guess(target):
    user_guess = input("請輸入你猜的數 >>> ")
    breakpoint()   //加入這一行
    if user_guess == target:
        return "你猜對了!"
    else:
        return "猜錯了"


if __name__ == '__main__':
    a = 100
    print(guess(a))

在 pdb 提示符下,我們可以呼叫 locals() 來查看當前的本地作用域的所有變數,(pdb 有大量的命令,你也可以在其中運行正常的Python 陳述句)

請輸入你猜的數 >>> 100
> d:\work\for_test\py3_test\test.py(7)guess()
-> if user_guess == target:
(Pdb) locals()
{'target': 100, 'user_guess': '100'}
(Pdb) type(user_guess)
<class 'str'>

搞明白了,target是一個整數,而user_guess 是一個字串,這里發生了型別對比錯誤,

2、型別和注解

從 Python 3.5 開始,型別注解就越來越受歡迎,對于那些不熟悉型別提示的人來說,這是一種完全可選的注釋代碼的方式,以指定變數的型別,

什么是注解?它們是關聯元資料與變數的語法支持,可以是任意運算式,在運行時被 Python 計算但被忽略,注解可以是任何有效的 Python 運算式,

下面是個對比的例子:

# 不帶型別注解
def foo(bar, baz):
# 帶型別注解
def foo(bar: 'Describe the bar', baz: print('random')) -> 'return thingy':

上面的做法,其實是Python對自身弱型別語言的強化,希望獲得一定的型別可靠和健壯度,向Java等語言靠攏,

在 Python 3.5 中,注解的語法獲得標準化,此后,Python 社區廣泛使用了注解型別提示,

但是,注解僅僅是一種開發工具,可以使用 PyCharm 等 IDE 或 Mypy 等第三方工具進行檢查,并不是語法層面的限制,

我們前面的猜數程式如果添加型別注解,它應該是這樣的:

"""猜數字游戲"""


def guess(target:str):
    user_guess:str = input("請輸入你猜的數 >>> ")
    breakpoint()
    if user_guess == target:
        return "你猜對了!"
    else:
        return "猜錯了"


if __name__ == '__main__':
    a:int = 100
    print(guess(a))

PyCharm會給我們灰色的規范錯誤提醒,但不會給紅色的語法錯誤提示,

用注解作為型別提示時,有兩個主要問題:啟動性能和前向參考

  • 在定義時計算大量任意運算式相當影響啟動性能,而且 typing 模塊非常慢
  • 你不能用尚未宣告的型別來注解

typing 模塊如此緩慢的部分原因是,最初的設計目標是在不修改核心 CPython 解釋器的情況下實作 typing 模塊,隨著型別提示變得越來越流行,這一限制已經被移除,這意味著現在有了對 typing 的核心支持,

而對于向前參考,看下面的例子:

class User:
    def __init__(self, name: str, prev_user: User) -> None:
        pass

錯誤在于 User型別還沒有被宣告,此時的 prev_user 不能定義為 User 型別,

為了解決這個問題,Python3.7 將注解的評估進行了推遲,并且,這項改動向后不兼容,需要先匯入annotations,只有到Python 4.0后才會成為默認行為,

from __future__ import annotations

class User: 
    def __init__(self, name: str, prev_user: User) -> None:
        pass

或者如下面的例子:

class C:
    def validate_b(self, obj: B) -> bool:
        ...
class B:
    ...

3、新增dataclasses模塊

這個特性可能是 Python3.7以后比較常用的,它有什么作用呢?

假如我們需要撰寫一個下面的類:

from datetime import datetime
import dateutil

class Article(object):
    def __init__(self, _id, author_id, title, text, tags=None, 
                 created=datetime.now(), edited=datetime.now()):
    self._id = _id
    self.author_id = author_id
    self.title = title
    self.text = text
    self.tags = list() if tags is None else tags
    self.created = created
    self.edited = edited

    if type(self.created) is str:
       self.created = dateutil.parser.parse(self.created)

    if type(self.edited) is str:
       self.edited = dateutil.parser.parse(self.edited)

    def __eq__(self, other):
        if not isinstance(other, self.__class__):
            return NotImplemented
        return (self._id, self.author_id) == (other._id, other.author_id)

    def __lt__(self, other):
        if not isinstance(other, self.__class__):
            return NotImplemented
        return (self._id, self.author_id) < (other._id, other.author_id)

    def __repr__(self):
        return '{}(id={}, author_id={}, title={})'.format(
                self.__class__.__name__, self._id, self.author_id, self.title)

大量的初始化屬性要定義默認值,可能還需要重寫一堆魔法方法,來實作類實體的列印、比較、排序和去重等功能,

如果使用dataclasses進行改造,可以寫成這個樣子:

from dataclasses import dataclass, field
from typing import List
from datetime import datetime
import dateutil

@dataclass(order=True)   //注意這里
class Article(object):
    _id: int
    author_id: int
    title: str = field(compare=False)
    text: str = field(repr=False, compare=False)
    tags: List[str] = field(default=list(), repr=False, compare=False)
    created: datetime = field(default=datetime.now(), repr=False, compare=False)
    edited: datetime = field(default=datetime.now(), repr=False, compare=False)

    def __post_init__(self):
       if type(self.created) is str:
           self.created = dateutil.parser.parse(self.created)

       if type(self.edited) is str:
           self.edited = dateutil.parser.parse(self.edited)

這使得類不僅容易設定,而且當我們創建一個實體并列印出來時,它還可以自動生成優美的字串,在與其他類實體進行比較時,它也會有適當的行為,這是因為dataclasses除了幫我們自動生成 __init__ 方法外,還生成了一些其他特殊方法,如 repreqhash 等,

Dataclasses 使用欄位 field來完提供默認值,手動構造一個 field() 函式能夠訪問其他選項,從而更改默認值,例如,這里將 field 中的 default_factory 設定為一個 lambda 函式,該函式提示用戶輸入其名稱,

from dataclasses import dataclass, field
class User:
    name: str = field(default_factory=lambda: input("enter name"))

4、生成器例外處理

在Python 3.7中,生成器引發StopIteration例外后,StopIteration例外將被轉換成RuntimeError例外,那樣它不會悄悄一路影回應用程式的堆疊框架,這意味著如何處理生成器的行為方面不太敏銳的一些程式會在Python 3.7中拋出RuntimeError,在Python 3.6中,這種行為生成一個棄用警告;在Python 3.7中,它將生成一個完整的錯誤,

一個簡易的方法是使用try/except代碼段,在StopIteration傳播到生成器的外面捕獲它,更好的解決方案是重新考慮如何構建生成器――比如說,使用return陳述句來終止生成器,而不是手動引發StopIteration,

5、開發模式

Python解釋器添加了一個新的命令列開關:-X,讓開發人員可以為解釋器設定許多低級選項,

這種運行時的檢查機制通常對性能有重大影響,但在除錯程序中對開發人員很有用,

-X 激活的選項包括:

  • asyncio模塊的除錯模式,這為異步操作提供了更詳細的日志記錄和例外處理,而例外操作可能很難除錯或推理,
  • 面向記憶體分配器的除錯鉤子,這對于撰寫CPython擴展件的那些人很有用,它能夠實作更明確的運行時檢查,了解CPython如何在內部分配記憶體和釋放記憶體,
  • 啟用faulthandler模塊,那樣發生崩潰后,traceback始終轉儲出去,

6、 高精度時間函式

Python 3.7中一類新的時間函式回傳納秒精度的時間值,盡管Python是一種解釋型語言,但是Python的核心開發人員維克多?斯廷納(Victor Stinner)主張報告納秒精度的時間,最主要的原因是,在處理轉換其他程式(比如資料庫)記錄的時間值時,可以避免丟失精度,

新的時間函式使用后綴_ns比如說,time.process_time()的納秒版本是time.process_time_ns(),請注意,并非所有的時間函式都有對應的納秒版本,

7、其他新特性

  • 字典現在保持插入順序,這在 3.6 中是非正式的,但現在成為了官方語言規范,在大多數情況下,普通的 dict 能夠替換 collections.OrderedDict
  • .pyc 檔案具有確定性,支持可重復構建 —— 也就是說,總是為相同的輸入檔案生成相同的 byte-for-byte 輸出,
  • 新增contextvars模塊,針對異步任務提供背景關系變數,
  • __main__中的代碼會顯示棄用警告(DeprecationWarning),
  • 新增UTF-8模式,在Linux/Unix系統,將忽略系統的locale,使用UTF-8作為默認編碼,在非Linux/Unix系統,需要使用-X utf8選項啟用UTF-8模式,
  • 允許模塊定義__getattr__、__dir__函式,為棄用警告、延遲import子模塊等提供便利,
  • 新的執行緒本地存盤C語言API,
  • 更新Unicode資料到11.0,

三、Python3.8新特性

Python3.8版本于2019年10月14日發布,以下是 Python 3.8 相比 3.7 的新增特性,

1、海象賦值運算式

新的語法 :=,將值賦給一個更大的運算式中的變數,它被親切地稱為 “海象運算子”(walrus operator),因為它長得像海象的眼睛和象牙,

“海象運算子” 在某些時候可以讓你的代碼更整潔,比如:

在下面的示例中,賦值運算式可以避免呼叫 len () 兩次:

if (n := len(a)) > 10:	
    print(f"List is too long ({n} elements, expected <= 10)")

類似的好處還可體現在正則運算式匹配中需要使用兩次匹配物件的情況中,一次檢測用于匹配是否發生,另一次用于提取子分組:

discount = 0.0	

if (mo := re.search(r'(\d+)% discount', advertisement)):	
    discount = float(mo.group(1)) / 100.0

此運算子也可用于配合 while 回圈計算一個值,來檢測回圈是否終止,而同一個值又在回圈體中再次被使用的情況:

# Loop over fixed length blocks	

while (block := f.read(256)) != '':	
    process(block)

或者出現于串列推導式中,在篩選條件中計算一個值,而同一個值又在運算式中需要被使用:

[clean_name.title() for name in names	

 if (clean_name := normalize('NFC', name)) in allowed_names]

請盡量將海象運算子的使用限制在清晰的場合中,以降低復雜性并提升可讀性,

2、僅限位置形參

新增一個函式形參語法 / 用來指明某些函式形參必須使用僅限位置而非關鍵字引數的形式,

這種標記語法與通過 help () 所顯示的使用 Larry Hastings 的 Argument Clinic 工具標記的 C 函式相同,

在下面的例子中,形參 a 和 b 為僅限位置形參,c 或 d 可以是位置形參或關鍵字形參,而 e 或 f 要求為關鍵字形參:

def f(a, b, /, c, d, *, e, f):	

    print(a, b, c, d, e, f)

以下是合法的呼叫:

f(10, 20, 30, d=40, e=50, f=60)

但是,以下均為不合法的呼叫:

f(10, b=20, c=30, d=40, e=50, f=60)   # b 不可以是一個關鍵字引數
f(10, 20, 30, 40, 50, f=60)           # e 必須是一個關鍵字引數

這種標記形式的一個用例是它允許純 Python 函式完整模擬現有的用 C 代碼撰寫的函式的行為,例如,內置的 pow () 函式不接受關鍵字引數:

def pow(x, y, z=None, /):	

    "Emulate the built in pow() function"	

    r = x ** y	

    return r if z is None else r%z

另一個用例是在不需要形參名稱時排除關鍵字引數,例如,內置的 len () 函式的簽名為 len (obj, /),這可以排除如下這種笨拙的呼叫形式:

len(obj='hello')  # The "obj" keyword argument impairs readability

另一個益處是將形參標記為僅限位置形參將允許在未來修改形參名而不會破壞客戶的代碼,例如,在 statistics 模塊中,形參名 dist 在未來可能被修改,這使得以下函式描述成為可能:

def quantiles(dist, /, *, n=4, method='exclusive')	
    ...

由于在 / 左側的形參不會被公開為可用關鍵字,其他形參名仍可在 **kwargs 中使用:

>>> def f(a, b, /, **kwargs):	
...     print(a, b, kwargs)	
...	
>>> f(10, 20, a=1, b=2, c=3)         # a and b are used in two ways	
10 20 {'a': 1, 'b': 2, 'c': 3}

這極大地簡化了需要接受任意關鍵字引數的函式和方法的實作,例如,下面是 collections 模塊中的代碼摘錄:

class Counter(dict):	

    def __init__(self, iterable=None, /, **kwds):	

        # Note "iterable" is a possible keyword argument

3、f 字串支持 =

增加 = 說明符用于 f-string,形式為 f'{expr=}' 的 f 字串將擴展表示為運算式文本,加一個等于號,再加運算式的求值結果,例如:

>>> user = 'eric_idle'	
>>> member_since = date(1975, 7, 31)	
>>> f'{user=} {member_since=}'	

"user='eric_idle' member_since=datetime.date(1975, 7, 31)"

f 字串格式說明符允許更細致地控制所要顯示的運算式結果:

>>> delta = date.today() - member_since	

>>> f'{user=!s}  {delta.days=:,d}'	
'user=eric_idle  delta.days=16,075'

= 說明符將輸出整個運算式,以便詳細演示計算程序:

>>> print(f'{theta=}  {cos(radians(theta))=:.3f}')	
theta=30  cos(radians(theta))=0.866

4、 typing模塊的改進

Python是動態型別語言,但可以通過typing模塊添加型別提示,以便第三方工具驗證Python代碼,Python 3.8給typing添加了一些新元素,因此它能夠支持更健壯的檢查:

  • final修飾器和Final型別標注表明,被修飾或被標注的物件在任何時候都不應該被重寫、繼承,也不能被重新賦值,
  • Literal型別將運算式限定為特定的值或值的串列(不一定是同一個型別的值),
  • TypedDict可以用來創建字典,其特定鍵的值被限制在一個或多個型別上,注意這些限制僅用于編譯時確定值的合法性,而不能在運行時進行限制,

5、多行程共享記憶體

multiprocessing模塊新增SharedMemory類,可以在不同的Python進城之間創建共享的記憶體區域,

在舊版本的Python中,行程間共享資料只能通過寫入檔案、通過網路套接字發送,或采用Python的pickle模塊進行序列化等方式,共享記憶體提供了行程間傳遞資料的更快的方式,從而使得Python的多處理器和多內核編程更有效率,

共享記憶體片段可以作為單純的位元組區域來分配,也可以作為不可修改的類似于串列的物件來分配,其中能保存數字型別、字串、位元組物件、None物件等一小部分Python物件,

6、 新版本的pickle協議

Python的pickle模塊提供了一種序列化和反序列化Python資料結構或實體的方法,可以將字典原樣保存下來供以后讀取,不同版本的Python支持的pickle協議不同,而3.8版本的支持范圍更廣、更強大、更有效的序列化,

Python 3.8引入的第5版pickle協議可以用一種新方法pickle物件,它能支持Python的緩沖區協議,如bytes、memoryviews或Numpy array等,新的pickle避免了許多在pickle這些物件時的記憶體復制操作,

NumPy、Apache Arrow等外部庫在各自的Python系結中支持新的pickle協議,新的pickle也可以作為Python 3.6和3.7的插件使用,可以從PyPI上安裝,

7、性能改進

  • 許多內置方法和函式的速度都提高了20%~50%,因為之前許多函式都需要進行不必要的引數轉換,
  • 一個新的opcode快取可以提高解釋器中特定指令的速度,但是,目前實作了速度改進的只有LOAD_GLOBAL opcode,其速度提高了40%,以后的版本中也會進行類似的優化,
  • 檔案復制操作如shutil.copyfile()shutil.copytree()現在使用平臺特定的呼叫和其他優化措施,來提高操作速度,
  • 新創建的串列現在平均比以前小了12%,這要歸功于串列建構式如果能提前知道串列長度的情況下,可以進行優化,
  • Python 3.8中向新型類(如class A(object))的類變數中的寫入操作變得更快,operator.itemgetter()和collections.namedtuple()也得到了速度優化,

更多詳細特性,請查閱Python 3.8.0檔案:https://docs.python.org/zh-cn/3.8/whatsnew/3.8.html

轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/147252.html

標籤:Python

上一篇:x01.editor: 語法高亮編輯器

下一篇:能不能幫幫忙,怎么弄好它

標籤雲
其他(157675) Python(38076) JavaScript(25376) Java(17977) C(15215) 區塊鏈(8255) C#(7972) AI(7469) 爪哇(7425) MySQL(7132) html(6777) 基礎類(6313) sql(6102) 熊猫(6058) PHP(5869) 数组(5741) R(5409) Linux(5327) 反应(5209) 腳本語言(PerlPython)(5129) 非技術區(4971) Android(4554) 数据框(4311) css(4259) 节点.js(4032) C語言(3288) json(3245) 列表(3129) 扑(3119) C++語言(3117) 安卓(2998) 打字稿(2995) VBA(2789) Java相關(2746) 疑難問題(2699) 细绳(2522) 單片機工控(2479) iOS(2429) ASP.NET(2402) MongoDB(2323) 麻木的(2285) 正则表达式(2254) 字典(2211) 循环(2198) 迅速(2185) 擅长(2169) 镖(2155) 功能(1967) .NET技术(1958) Web開發(1951) python-3.x(1918) HtmlCss(1915) 弹簧靴(1913) C++(1909) xml(1889) PostgreSQL(1872) .NETCore(1853) 谷歌表格(1846) Unity3D(1843) for循环(1842)

熱門瀏覽
  • 【C++】Microsoft C++、C 和匯編程式檔案

    ......

    uj5u.com 2020-09-10 00:57:23 more
  • 例外宣告

    相比于斷言適用于排除邏輯上不可能存在的狀態,例外通常是用于邏輯上可能發生的錯誤。 例外宣告 Item 1:當函式不可能拋出例外或不能接受拋出例外時,使用noexcept 理由 如果不打算拋出例外的話,程式就會認為無法處理這種錯誤,并且應當盡早終止,如此可以有效地阻止例外的傳播與擴散。 示例 //不可 ......

    uj5u.com 2020-09-10 00:57:27 more
  • Codeforces 1400E Clear the Multiset(貪心 + 分治)

    鏈接:https://codeforces.com/problemset/problem/1400/E 來源:Codeforces 思路:給你一個陣列,現在你可以進行兩種操作,操作1:將一段沒有 0 的區間進行減一的操作,操作2:將 i 位置上的元素歸零。最終問:將這個陣列的全部元素歸零后操作的最少 ......

    uj5u.com 2020-09-10 00:57:30 more
  • UVA11610 【Reverse Prime】

    本人看到此題沒有翻譯,就附帶了一個自己的翻譯版本 思考 這一題,它的第一個要求是找出所有 $7$ 位反向質數及其質因數的個數。 我們應該需要質數篩篩選1~$10^{7}$的所有數,這里就不慢慢介紹了。但是,重讀題,我們突然發現反向質數都是 $7$ 位,而將它反過來后的數字卻是 $6$ 位數,這就說明 ......

    uj5u.com 2020-09-10 00:57:36 more
  • 統計區間素數數量

    1 #pragma GCC optimize(2) 2 #include <bits/stdc++.h> 3 using namespace std; 4 bool isprime[1000000010]; 5 vector<int> prime; 6 inline int getlist(int ......

    uj5u.com 2020-09-10 00:57:47 more
  • C/C++編程筆記:C++中的 const 變數詳解,教你正確認識const用法

    1、C中的const 1、區域const變數存放在堆疊區中,會分配記憶體(也就是說可以通過地址間接修改變數的值)。測驗代碼如下: 運行結果: 2、全域const變數存放在只讀資料段(不能通過地址修改,會發生寫入錯誤), 默認為外部聯編,可以給其他源檔案使用(需要用extern關鍵字修飾) 運行結果: ......

    uj5u.com 2020-09-10 00:58:04 more
  • 【C++犯錯記錄】VS2019 MFC添加資源不懂如何修改資源宏ID

    1. 首先在資源視圖中,添加資源 2. 點擊新添加的資源,復制自動生成的ID 3. 在解決方案資源管理器中找到Resource.h檔案,編輯,使用整個專案搜索和替換的方式快速替換 宏宣告 4. Ctrl+Shift+F 全域搜索,點擊查找全部,然后逐個替換 5. 為什么使用搜索替換而不使用屬性視窗直 ......

    uj5u.com 2020-09-10 00:59:11 more
  • 【C++犯錯記錄】VS2019 MFC不懂的批量添加資源

    1. 打開資源頭檔案Resource.h,在其中預先定義好宏 ID(不清楚其實ID值應該設定多少,可以先新建一個相同的資源項,再在這個資源的ID值的基礎上遞增即可) 2. 在資源視圖中選中專案資源,按F7編輯資源檔案,按 ID 型別 相對路徑的形式添加 資源。(別忘了先把檔案拷貝到專案中的res檔案 ......

    uj5u.com 2020-09-10 01:00:19 more
  • C/C++編程筆記:關于C++的參考型別,專供新手入門使用

    今天要講的是C++中我最喜歡的一個用法——參考,也叫別名。 參考就是給一個變數名取一個變數名,方便我們間接地使用這個變數。我們可以給一個變數創建N個參考,這N + 1個變數共享了同一塊記憶體區域。(參考型別的變數會占用記憶體空間,占用的記憶體空間的大小和指標型別的大小是相同的。雖然參考是一個物件的別名,但 ......

    uj5u.com 2020-09-10 01:00:22 more
  • 【C/C++編程筆記】從頭開始學習C ++:初學者完整指南

    眾所周知,C ++的學習曲線陡峭,但是花時間學習這種語言將為您的職業帶來奇跡,并使您與其他開發人員區分開。您會更輕松地學習新語言,形成真正的解決問題的技能,并在編程的基礎上打下堅實的基礎。 C ++將幫助您養成良好的編程習慣(即清晰一致的編碼風格,在撰寫代碼時注釋代碼,并限制類內部的可見性),并且由 ......

    uj5u.com 2020-09-10 01:00:41 more
最新发布
  • Rust中的智能指標:Box<T> Rc<T> Arc<T> Cell<T> RefCell<T> Weak

    Rust中的智能指標是什么 智能指標(smart pointers)是一類資料結構,是擁有資料所有權和額外功能的指標。是指標的進一步發展 指標(pointer)是一個包含記憶體地址的變數的通用概念。這個地址參考,或 ” 指向”(points at)一些其 他資料 。參考以 & 符號為標志并借用了他們所 ......

    uj5u.com 2023-04-20 07:24:10 more
  • Java的值傳遞和參考傳遞

    值傳遞不會改變本身,參考傳遞(如果傳遞的值需要實體化到堆里)如果發生修改了會改變本身。 1.基本資料型別都是值傳遞 package com.example.basic; public class Test { public static void main(String[] args) { int ......

    uj5u.com 2023-04-20 07:24:04 more
  • [2]SpinalHDL教程——Scala簡單入門

    第一個 Scala 程式 shell里面輸入 $ scala scala> 1 + 1 res0: Int = 2 scala> println("Hello World!") Hello World! 檔案形式 object HelloWorld { /* 這是我的第一個 Scala 程式 * 以 ......

    uj5u.com 2023-04-20 07:23:58 more
  • 理解函式指標和回呼函式

    理解 函式指標 指向函式的指標。比如: 理解函式指標的偽代碼 void (*p)(int type, char *data); // 定義一個函式指標p void func(int type, char *data); // 宣告一個函式func p = func; // 將指標p指向函式func ......

    uj5u.com 2023-04-20 07:23:52 more
  • Django筆記二十五之資料庫函式之日期函式

    本文首發于公眾號:Hunter后端 原文鏈接:Django筆記二十五之資料庫函式之日期函式 日期函式主要介紹兩個大類,Extract() 和 Trunc() Extract() 函式作用是提取日期,比如我們可以提取一個日期欄位的年份,月份,日等資料 Trunc() 的作用則是截取,比如 2022-0 ......

    uj5u.com 2023-04-20 07:23:45 more
  • 一天吃透JVM面試八股文

    什么是JVM? JVM,全稱Java Virtual Machine(Java虛擬機),是通過在實際的計算機上仿真模擬各種計算機功能來實作的。由一套位元組碼指令集、一組暫存器、一個堆疊、一個垃圾回收堆和一個存盤方法域等組成。JVM屏蔽了與作業系統平臺相關的資訊,使得Java程式只需要生成在Java虛擬機 ......

    uj5u.com 2023-04-20 07:23:31 more
  • 使用Java接入小程式訂閱訊息!

    更新完微信服務號的模板訊息之后,我又趕緊把微信小程式的訂閱訊息給實作了!之前我一直以為微信小程式也是要企業才能申請,沒想到小程式個人就能申請。 訊息推送平臺🔥推送下發【郵件】【短信】【微信服務號】【微信小程式】【企業微信】【釘釘】等訊息型別。 https://gitee.com/zhongfuch ......

    uj5u.com 2023-04-20 07:22:59 more
  • java -- 緩沖流、轉換流、序列化流

    緩沖流 緩沖流, 也叫高效流, 按照資料型別分類: 位元組緩沖流:BufferedInputStream,BufferedOutputStream 字符緩沖流:BufferedReader,BufferedWriter 緩沖流的基本原理,是在創建流物件時,會創建一個內置的默認大小的緩沖區陣列,通過緩沖 ......

    uj5u.com 2023-04-20 07:22:49 more
  • Java-SpringBoot-Range請求頭設定實作視頻分段傳輸

    老實說,人太懶了,現在基本都不喜歡寫筆記了,但是網上有關Range請求頭的文章都太水了 下面是抄的一段StackOverflow的代碼...自己大修改過的,寫的注釋挺全的,應該直接看得懂,就不解釋了 寫的不好...只是希望能給視頻網站開發的新手一點點幫助吧. 業務場景:視頻分段傳輸、視頻多段傳輸(理 ......

    uj5u.com 2023-04-20 07:22:42 more
  • Windows 10開發教程_編程入門自學教程_菜鳥教程-免費教程分享

    教程簡介 Windows 10開發入門教程 - 從簡單的步驟了解Windows 10開發,從基本到高級概念,包括簡介,UWP,第一個應用程式,商店,XAML控制元件,資料系結,XAML性能,自適應設計,自適應UI,自適應代碼,檔案管理,SQLite資料庫,應用程式到應用程式通信,應用程式本地化,應用程式 ......

    uj5u.com 2023-04-20 07:22:35 more