主頁 > 後端開發 > Python3標準庫:collections容器資料型別

Python3標準庫:collections容器資料型別

2020-10-26 15:37:06 後端開發

1. collections容器資料型別

collections模塊包含除內置型別list、dict和tuple以外的其他容器資料型別,

1.1 ChainMap搜索多個字典

ChainMap類管理一個字典序列,并按其出現的順序搜索以查找與鍵關聯的值,ChainMap提供了一個很多的“背景關系”容器,因為可以把它看作一個堆疊,堆疊增長時發生變更,堆疊收縮時這些變更被丟棄,

1.1.1 訪問值

ChainMap支持與常規字典相同的api來訪問現有的值,

import collections

a = {'a': 'A', 'c': 'C'}
b = {'b': 'B', 'c': 'D'}

m = collections.ChainMap(a, b)

print('Individual Values')
print('a = {}'.format(m['a']))
print('b = {}'.format(m['b']))
print('c = {}'.format(m['c']))
print()

print('Keys = {}'.format(list(m.keys())))
print('Values = {}'.format(list(m.values())))
print()

print('Items:')
for k, v in m.items():
    print('{} = {}'.format(k, v))
print()

print('"d" in m: {}'.format(('d' in m)))

按子映射傳遞到建構式的順序來搜索這些子映射,所以對應鍵 'c' 報告的值來自a字典,

1.1.2 重排

ChainMap會在它的maps屬性中存盤要搜索的映射串列,這個串列是可變的,所以可以直接增加新映射,或者改變元素的順序以控制查找和更新行為,

import collections

a = {'a': 'A', 'c': 'C'}
b = {'b': 'B', 'c': 'D'}

m = collections.ChainMap(a, b)

print(m.maps)
print('c = {}\n'.format(m['c']))

# reverse the list
m.maps = list(reversed(m.maps))

print(m.maps)
print('c = {}'.format(m['c']))

要映射串列反轉時,與之關聯的值將 'c' 更改,

 

1.1.3 更新值

ChainMap不會快取子映射中的值,因此,如果它們的內容有修改,則訪問ChainMap時會反映到結果中,

import collections

a = {'a': 'A', 'c': 'C'}
b = {'b': 'B', 'c': 'D'}

m = collections.ChainMap(a, b)
print('Before: {}'.format(m['c']))
a['c'] = 'E'
print('After : {}'.format(m['c']))

改變與現有鍵關聯的值與增加新元素的做法一樣,

 

也可以直接通過ChainMap設定值,不過實際上只有鏈中的第一個映射會被修改,

import collections

a = {'a': 'A', 'c': 'C'}
b = {'b': 'B', 'c': 'D'}

m = collections.ChainMap(a, b)
print('Before:', m)
m['c'] = 'E'
print('After :', m)
print('a:', a)

使用m存盤新值時,a映射會更新,

ChainMap提供了一種便利方法,可以用一個額外的映射在maps串列的最前面創建一個新實體,這樣就能輕松地避免修改現有的底層資料結構,

import collections

a = {'a': 'A', 'c': 'C'}
b = {'b': 'B', 'c': 'D'}

m1 = collections.ChainMap(a, b)
m2 = m1.new_child()

print('m1 before:', m1)
print('m2 before:', m2)

m2['c'] = 'E'

print('m1 after:', m1)
print('m2 after:', m2)

正是基于這種堆疊行為,可以很方便地使用ChainMap實體作為模板或應用背景關系,具體地,可以很容易地在一次迭代中增加或更新值,然后再下一次迭代中丟棄這些改變,

如果新背景關系已知或提前構建,還可以向new_child()傳遞一個映射,

import collections

a = {'a': 'A', 'c': 'C'}
b = {'b': 'B', 'c': 'D'}
c = {'c': 'E'}

m1 = collections.ChainMap(a, b)
m2 = m1.new_child(c)

print('m1["c"] = {}'.format(m1['c']))
print('m2["c"] = {}'.format(m2['c']))

這相當于:

m2 = collections.ChainMap(c, *m1.maps)

并且還會產生:

 

1.2 Counter統計可散列的物件  

Counter是一個容器,可以跟蹤等效值增加的次數,這個類可以用來實作其他語言中常用包(bag)或多集合(multiset)資料結構實作的演算法,

1.2.1 初始化

Counter支持3種形式的初始化,呼叫Counter的建構式時可以提供一個元素序列或者一個包含鍵和計數的字典,還可以使用關鍵字引數將字串名映射到計數,

import collections

print(collections.Counter(['a', 'b', 'c', 'a', 'b', 'b']))
print(collections.Counter({'a': 2, 'b': 3, 'c': 1}))
print(collections.Counter(a=2, b=3, c=1))

這3種形式的初始化結果都是一樣的,

如果不提供任何引數,則可以構造一個空Counter,然后通過update()方法填充,

import collections

c = collections.Counter()
print('Initial :', c)

c.update('abcdaab')
print('Sequence:', c)

c.update({'a': 1, 'd': 5})
print('Dict    :', c)

計數值只會根據新資料增加,替換資料并不會改變計數,在下面的例子中,a的計數會從3增加到4,

1.2.2 訪問計數

一旦填充了Counter,便可以使用字典API獲取它的值,

import collections

c = collections.Counter('abcdaab')

for letter in 'abcde':
    print('{} : {}'.format(letter, c[letter]))

對于未知的元素,Counter不會產生KeyError,如果在輸入中沒有找到某個值(此例中的e),則其計數為0.

elements()方法回傳一個迭代器,該迭代器將生成Counter知道的所有元素,

import collections

c = collections.Counter('extremely')
c['z'] = 0
print(c)
print(list(c.elements()))

不能保證元素的順序不變,另外計數小于或等于0的元素不包含在內,

使用most_common()可以生成一個序列,其中包含n個最常遇到的輸入值及相應計數,

import collections

c = collections.Counter()
with open('test.txt', 'rt') as f:
    for line in f:
        c.update(line.rstrip().lower())

print('Most common:')
for letter, count in c.most_common(3):
    print('{}: {:>7}'.format(letter, count))

這個例子要統計系統字典內所有單詞中出現的字母,以生成一個頻度分布,然后列印3個最常見的字母,如果不向most_common()提供引數,則會生成由所有元素構成的一個串列,按頻度排序,

1.2.3 算術操作

Counter實體支持用算術和集合操作來完成結果的聚集,下面這個例子展示了創建新Counter實體的標準運算子,不過也支持+=,-=,&=和|=等原地執行的運算子, 

import collections

c1 = collections.Counter(['a', 'b', 'c', 'a', 'b', 'b'])
c2 = collections.Counter('alphabet')

print('C1:', c1)
print('C2:', c2)

print('\nCombined counts:')
print(c1 + c2)

print('\nSubtraction:')
print(c1 - c2)

print('\nIntersection (taking positive minimums):')
print(c1 & c2)

print('\nUnion (taking maximums):')
print(c1 | c2)

每次通過一個操作生成一個新的Counter時,計數為0或負數的元素都會被洗掉,在c1和c2中a的計數相同,所以減法操作后它的計數為0,

1.3 defaultdict缺少的鍵回傳一個默認值 

標準字典包括一個setdefault()方法,該方法被用來獲取一個值,如果這個值不存在則建立一個默認值,與之相反,初始化容器時defaultdict會讓呼叫者提前指定默認值, 

import collections

def default_factory():
    return 'default value'

d = collections.defaultdict(default_factory, foo='bar')
print('d:', d)
print('foo =>', d['foo'])
print('bar =>', d['bar'])

只要所有鍵都有相同的默認值,那么這個方法就可以被很好的使用,如果默認值是一種用于聚集或累加值的型別,如list、set或者int,那么這個方法尤其有用,標準庫檔案提供了很多以這種方式使用defaultdict的例子,

1.4 deque雙端佇列

雙端佇列或deque支持從任意一端增加和洗掉元素,更為常用的兩種結構(即堆疊和佇列)就是雙端佇列的退化形式,它們的輸入和輸出被限制在某一端,

import collections

d = collections.deque('abcdefg')
print('Deque:', d)
print('Length:', len(d))
print('Left end:', d[0])
print('Right end:', d[-1])

d.remove('c')
print('remove(c):', d)

由于deque是一種序列容器,因此同樣支持list的一些操作,如用__getitem__()檢查內容,確定長度,以及通過匹配標識從佇列中間洗掉元素,

1.4.1 填充

可以從任意一端填充deque,其在Python實作中被稱為"左端"和"右端" ,

import collections

# Add to the right
d1 = collections.deque()
d1.extend('abcdefg')
print('extend    :', d1)
d1.append('h')
print('append    :', d1)

# Add to the left
d2 = collections.deque()
d2.extendleft(range(6))
print('extendleft:', d2)
d2.appendleft(6)
print('appendleft:', d2)

extendleft()函式迭代處理其輸入,對各個元素完成與appendleft()同樣的處理,最終結果是deque將包含逆序的輸入序列,

1.4.2 消除

類似地,可以從兩端或任意一端消除deque的元素,這取決于所應用的演算法, 

import collections

print('From the right:')
d = collections.deque('abcdefg')
while True:
    try:
        print(d.pop(), end='')
    except IndexError:
        break
print()

print('\nFrom the left:')
d = collections.deque(range(6))
while True:
    try:
        print(d.popleft(), end='')
    except IndexError:
        break
print()

使用pop()可以從deque的右端洗掉一個元素,使用popleft()可以從左端取一個元素,

由于雙端佇列是執行緒安全的,所以甚至可以在不同執行緒中同時從兩端消除佇列的內容,

import collections
import threading
import time

candle = collections.deque(range(5))

def burn(direction, nextSource):
    while True:
        try:
            next = nextSource()
        except IndexError:
            break
        else:
            print('{:>8}: {}'.format(direction, next))
            time.sleep(0.1)
    print('{:>8} done'.format(direction))
    return

left = threading.Thread(target=burn,
                        args=('Left', candle.popleft))
right = threading.Thread(target=burn,
                         args=('Right', candle.pop))

left.start()
right.start()

left.join()
right.join()

這個例子中的執行緒交替處理兩端,洗掉元素,直至這個deque為空,

1.4.3 旋轉

deque的另一個很有用的方面是可以按任意一個方向旋轉,從而跳過一些元素,

import collections

d = collections.deque(range(10))
print('Normal        :', d)

d = collections.deque(range(10))
d.rotate(2)
print('Right rotation:', d)

d = collections.deque(range(10))
d.rotate(-2)
print('Left rotation :', d)

將deque向右旋轉(使用一個正旋轉值)會從右端取元素,并且把它們移到左端,向左旋轉(使用一個負值)則從左端將元素移至右端,可以形象地把deque中的元素看作是刻在撥號盤上,這對于理解雙端佇列很有幫助,

1.4.4 限制佇列大小

配置deque實體時可以指定一個最大長度,使它不會超過這個大小,佇列達到指定長度時,隨著新元素的增加會洗掉現有的元素,如果要查找一個長度不確定的流中的最后n個元素,那么這種行為會很有用,

import collections
import random

# Set the random seed so we see the same output each time
# the script is run.
random.seed(1)

d1 = collections.deque(maxlen=3)
d2 = collections.deque(maxlen=3)

for i in range(5):
    n = random.randint(0, 100)
    print('n =', n)
    d1.append(n)
    d2.appendleft(n)
    print('D1:', d1)
    print('D2:', d2)

不論元素增加到哪一端,佇列長度都保持不變,

1.5 namedtuple帶命名欄位的元組子類

標準tuple使用數值索引來訪問其成員,

bob = ('Bob', 30, 'male')
print('Representation:', bob)

jane = ('Jane', 29, 'female')
print('\nField by index:', jane[0])

print('\nFields by index:')
for p in [bob, jane]:
    print('{} is a {} year old {}'.format(*p))

對于簡單的用途,tuple是很方便的容器,

另一方面,使用tuple時需要記住對應各個值要使用哪個索引,這可能會導致錯誤,特別是當tuple有大量欄位,而且構造元和使用元組的位置相距很遠時,namedtuple除了為各個成員指定數值索引外,還為其指定名字, 

1.5.1 定義

與常規的元組一樣,namedtuple實體在記憶體使用方面同樣很高效,因為它們沒有每一個實體的字典, 

各種namedtuple都由自己的類表示,這個類使用namedtuple()工廠數來創建,引數就是新類名和一個包含元素名的字串,

import collections

Person = collections.namedtuple('Person', 'name age')

bob = Person(name='Bob', age=30)
print('\nRepresentation:', bob)

jane = Person(name='Jane', age=29)
print('\nField by name:', jane.name)

print('\nFields by index:')
for p in [bob, jane]:
    print('{} is {} years old'.format(*p))

如這個例子所示,除了使用標準元組的位置索引外,還可以使用點記發(obj.attr)按名字訪問namedtuple的欄位,

與常規tuple類似,namedtuple也是不可修改的,這個限制允許tuple實體具有一致的散列值,這使得可以把它們用作字典中的鍵并包含在集合中, 

import collections

Person = collections.namedtuple('Person', 'name age')

pat = Person(name='Pat', age=12)
print('\nRepresentation:', pat)

pat.age = 21

如果試圖通過命名屬性改變一個值,那么這會導致一個AttributeError,

1.5.2 非法欄位名

如果欄位名重復或者與Python關鍵字沖突,那么其就是非法欄位名,

import collections

try:
    collections.namedtuple('Person', 'name class age')
except ValueError as err:
    print(err)

try:
    collections.namedtuple('Person', 'name age age')
except ValueError as err:
    print(err)

決議欄位名時,非法值會導致ValueError例外,

如果要基于程式控制之外的值創建一個namedtuple(如表示一個資料庫查詢回傳的記錄行,而事先并不知道資料庫模式),那么這種情況下應把rename選項設定為True,以對非法欄位重命名,

import collections

with_class = collections.namedtuple(
    'Person', 'name class age',
    rename=True)
print(with_class._fields)

two_ages = collections.namedtuple(
    'Person', 'name age age',
    rename=True)
print(two_ages._fields)

重命名欄位的新名字取決于它在元組中的索引,所以名為class的欄位會變成_1,重復的age欄位則變成_2,

1.5.3 指定屬性

namedtuple提供了很多有用的屬性和方法來處理子類和實體,所有這些內置屬性名都有一個下劃線(_)前綴,按慣例在大多數Python程式中,這都會指示一個私有屬性,不過,對于namedtuple,這個前綴是為了防止這個名字與用戶提供的屬性名沖突,

傳入namedtuple來定義新類的欄位名會保存在_fields屬性中,

import collections

Person = collections.namedtuple('Person', 'name age')

bob = Person(name='Bob', age=30)
print('Representation:', bob)
print('Fields:', bob._fields)

盡管引數是一個用空格分隔的字串,但儲存的值卻是由各個名字組成的一個序列,

可以使用_asdict()將namedtuple實體轉換為OrderedDict實體,

import collections

Person = collections.namedtuple('Person', 'name age')

bob = Person(name='Bob', age=30)
print('Representation:', bob)
print('As Dictionary:', bob._asdict())

OrderedDict的鍵與相應namedtuple的欄位順序相同,

_replace()方法構建一個新實體,在這個程序中會替換一些欄位的值, 

import collections

Person = collections.namedtuple('Person', 'name age')

bob = Person(name='Bob', age=30)
print('\nBefore:', bob)
bob2 = bob._replace(name='Robert')
print('After:', bob2)
print('Same?:', bob is bob2)

盡管從名字上看似憾訓修改現有的物件,但由于namedtuple實體是不可變的,所以實際上這個方法會回傳一個新物件,

1.6 OrderedDict記住向字典中添加鍵的順序 

OrderedDict是一個字典子類,可以記住其內容增加的順序,

import collections

print('Regular dictionary:')
d = {}
d['a'] = 'A'
d['b'] = 'B'
d['c'] = 'C'

for k, v in d.items():
    print(k, v)

print('\nOrderedDict:')
d = collections.OrderedDict()
d['a'] = 'A'
d['b'] = 'B'
d['c'] = 'C'

for k, v in d.items():
    print(k, v)

常規dict并不跟蹤插入順序,迭代處理時會根據散串列中如何存盤鍵來按順序生成值,而散串列中鍵的存盤會受一個隨機值的影響,以減少沖突,OrderedDict中則相反,它會記住元素插入的順序,并在創建迭代器時使用這個順序,

1.6.1 相等性

常規的dict在檢查相等性時會查看其內容,OrderedDict還會考慮元素增加的順序,

import collections

print('dict       :', end=' ')
d1 = {}
d1['a'] = 'A'
d1['b'] = 'B'
d1['c'] = 'C'

d2 = {}
d2['c'] = 'C'
d2['b'] = 'B'
d2['a'] = 'A'

print(d1 == d2)

print('OrderedDict:', end=' ')

d1 = collections.OrderedDict()
d1['a'] = 'A'
d1['b'] = 'B'
d1['c'] = 'C'

d2 = collections.OrderedDict()
d2['c'] = 'C'
d2['b'] = 'B'
d2['a'] = 'A'

print(d1 == d2)

在這個例子中,由于兩個有序字典由不同順序的值創建,所以認為這兩個有序字典是不同的,

1.6.2 重排

在OrderedDict中可以使用move_to_end()將鍵移至序列的起始或末尾位置來改變鍵的順序,

import collections

d = collections.OrderedDict(
    [('a', 'A'), ('b', 'B'), ('c', 'C')]
)

print('Before:')
for k, v in d.items():
    print(k, v)

d.move_to_end('b')

print('\nmove_to_end():')
for k, v in d.items():
    print(k, v)

d.move_to_end('b', last=False)

print('\nmove_to_end(last=False):')
for k, v in d.items():
    print(k, v)

last引數會告訴move_to_end()要把元素移動為鍵序列的最后一個元素(引數值為True)或者第一個元素(引數值為Flase),

1.7 collections.abc容器的抽象基類

collections.abc模塊包含一些抽象基類,其為Python內置容器資料結構以及collections模塊定義的容器資料結構定義了API, 

基類API 用途
Container   基本容器特性,如in運算子
Hashable   增加了散列支持,可以為容器實體提供散列值
Iterable   可以在容器內容上創建一個迭代器
Iterator Iterable 這是容器內容上的一個迭代器
Generator Iterator 為迭代器擴展了生成器協議
Sized   為知道自己大小的容器增加方法
Callable   可以作為函式來呼叫的容器
Sequence Sized, Iterable, Container 支持獲取單個元素以及迭代和改變元素順序
MutableSequence Sequence 支持創建一個實體之后增加和洗掉元素
ByteString Sequence 合并bytes和bytearray的API  
Set Sized, Iterable, Container 支持集合操作,如交集和并集
MutableSet Set 增加了創建集合后管理集合內容的方法
Mapping Sized, Iterable, Container 定義dict使用的只讀API
MutableMapping Mapping 定義創建映射后管理映射內容的方法
MappingView Sized 定義從迭代器訪問映射內容的方法
ItemsView MappingView, Set 視圖API的一部分
KeysView MappingView, Set 視圖API的一部分
ValuesView MappingView 視圖API的一部分
Awaitable   await運算式中可用的物件的API,如協程
Coroutine Awaitable 實作協程協議的類的API
AsyncIterable   與async for兼容的iterable的API
AsyncIterator AsyncIterable 異步迭代器的API

除了明確的定義不同的容器的API,這些抽象基類還可以在呼叫物件前用isinstance()測驗一個物件是否支持一個API,有些類還提供了方法實作,它們可以作為“混入類”(min-in)構造定制容器型別,而不必從頭實作每一個方法, 

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

標籤:Python

上一篇:python資料分析學習(2)pandas二維工具DataFrame講解

下一篇:輕松搞懂Python遞回函式的原理與應用

標籤雲
其他(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