主頁 > 後端開發 > Python基礎

Python基礎

2020-10-03 10:16:30 後端開發

1.資料型別:

# 可變:

list ,dict ,set(集合)

# 不可變:

int bool str tuple

# 有序: list,tuple,str,int,bool # 無序: dict(python3.6以后可以是有序的了),set


# 取值方式: # 索引: str list tuple # 直接: set ,int ,bool # 鍵: dict

 

注意:'is'和'=='

  '=='只比較值是否一樣

  'is'不僅比較值一樣還要比較記憶體地址是否一樣

2.深淺拷貝:

import copy

lst1=[1,2,3]

lst2=copy.copy(lst1)#淺拷貝

lst3=copy.deepcopy(lst1)#深拷貝

lst4=lst1 #賦值

 

定義:

淺拷貝 :

淺拷貝只拷貝第一層(如果有串列嵌套,他會復制那一個索引位置的串列的記憶體地址,而那個串列內的資料不會復制,說白了就是共用內部的list,最外層的list是自己新建的)

 

深拷貝:

可變型別拷貝,不可變型別共用(串列嵌套時,內層的串列地址不會復制,因為list是可變的,他是自己創個內部的list,然后共用list內的不可變元素的地址)

其實深拷貝不可變元素時也應該重新創建記憶體,來訪對應的不可變元素,因為小資料池的關系所以就沒新開辟地址.

 

注:

  如果發生了拷貝,記憶體地址一定發生變化,說白了拷貝就是自己新建地址,放復制過來的內容.

 

如下圖:深淺拷貝如果只拷貝一個單一的串列(串列內不包含字典串列等可變元素)的情況下,深淺拷貝效果都一樣:

 再看代碼:

#如果只是單一串列,深淺拷貝都一樣
import copy

lst1=[1,2,3]

lst2=copy.copy(lst1)#淺拷貝

lst3=copy.deepcopy(lst1)#深拷貝

print(id(lst1),id(lst2),id(lst3))#串列地址新建,全都不一樣
# 44954968 44957408 44990712
print(id(lst1[1]) , id(lst2[1]) , id(lst3[1]))#內部不可變元素全都共用
# 496100128 496100128 496100128

 

 

 

 重點(這里要著重理解):

串列內部加了串列后(深淺拷貝就不一樣了):

 

看代碼:

#如果串列套串列,深淺拷貝大不一樣了
import copy

lst1=[1,2,3,[4,5,6,[7,8,9]]]

lst2=copy.copy(lst1)#淺拷貝

lst3=copy.deepcopy(lst1)#深拷貝

print(id(lst1),id(lst2),id(lst3))#地址新建,全都不一樣
# 44954968 44957408 44990712
print(id(lst1[1]) , id(lst2[1]) , id(lst3[1]))#內部不可變元素全都共用
# 496100128 496100128 496100128

# 看內部串列
print(id(lst1[3]) , id(lst2[3]) , id(lst3[3]))#深拷貝是自己建的所以不一樣,淺拷貝是共用的
# 52295000 52295000 52330984

# 看內部串列的內部元素
print(id(lst1[3][0]) , id(lst2[3][0]) , id(lst3[3][0]))#4是不可變元素,共用
# 496296768 496296768 496296768

# 看內部串列再套的串列
print(id(lst1[3][3]) , id(lst2[3][3]) , id(lst3[3][3]))#還是只有深拷貝自己建(因為串列不管在哪都是可變元素),淺拷貝共用
# 44758360 44758360 44796584

print(id(lst1[3][3][1]) , id(lst2[3][3][1]) , id(lst3[3][3][1]))#里面的不可變元素8還是共用的
# 493675392 493675392 493675392

 

 

特殊情況(元組套串列):

如果單一元組深淺拷貝就都一樣:

import copy

v1=(1,2,3)

v2=copy.copy(v1)#淺拷貝

v3=copy.deepcopy(v1)#深拷貝

print(id(v1[1]),id(v2[1]),id(v3[1]))#內部不可變元素都是一樣的
# 501474080 501474080 501474080

print(id(v1),id(v2),id(v3))#淺拷貝只是單一元組,深淺拷貝都一樣,因為里面都是不可變元素,元組也不可變
# 47061912 47061912 47061912
copy.copy(v)=copy.deepcopy(v)
#單一元組時深淺拷貝都一樣

 

如果元組里有串列:

import copy

v1=(1,2,3,[4,5,6])

v2=copy.copy(v1)#淺拷貝

v3=copy.deepcopy(v1)#深拷貝

print(id(v1),id(v2),id(v3))#淺拷貝不變,深拷貝會變,因為里面多了不可變元素,深拷貝要變的
# 18215728 18215728 48191024
print(id(v1[1]),id(v2[1]),id(v3[1]))#內部不可變元素都是一樣的
# 501474080 501474080 501474080

print(id(v1[3]),id(v2[3]),id(v3[3]))#內部串列已經不同地址了所以元組也變了
# 51377496 51377496 51413360
元組套串列(元組里面都是不可變元素,都不變,怎么拷貝都一樣,如果元組里面有可變元素,例如串列,此時深拷貝會變,淺拷貝沒事,和原來一樣) 淺拷貝不變 深拷貝變了,因為深拷貝中不可變元素不會共用

 

3.閉包:

# 閉包,為函式創建一塊區域(開辟一個新的記憶體地址),
# 并且能保護這個函式內部的變數或者是這個函式內部創建的新函式不被銷毀,
# 并能一直為這個函式的執行提供這些被保護的資料

name ='oldboy'#這是全域變數,自己函式內部使用變數時,沒有的話先找父級,父級沒有才會找全域

def bar(name):
    #name='alex' 這樣定義一個變數和你把'alex'當引數傳進來是一個意思
    def inner():
        print(name)#使用變數名時,先找自己,自己沒有就找父級,父級沒有就找全域
    return inner #注意這里回傳的只是函式名,而不是函式名+括號

v1=bar('alex') #{name='alex',inner}當函式執行時會自動開辟一塊空間(記憶體地址)來執行這個函式,
# 執行之后就會銷毀這個執行函式的記憶體,而閉包不會銷毀,這塊執行函式的記憶體一直存在,這里的name變數和inner函式就被保護了起來,一直存在.
到了這里相當于是v1=inner,這個函式內部的變數一直在被呼叫,所以不會銷毀.除非v1執行了(inner函式被執行后)就銷毀了
v2=bar('eric') #{name='eric',inner} #v1和v2開辟的是不同的記憶體地址,并不會共用,所以他倆互相不影響 v1()#輸出'alex' 此時v1的bar函式新開辟的執行記憶體就銷毀了 v2()#輸出'eric' 此時v2的bar函式新開辟的執行記憶體也被銷毀了

 

閉包練習:

#第一題:

info=[] def func(): print(item) for item in range(10): #回圈不創建作用域,所以他還是在全域范圍做回圈,直接回圈到9就停止,并回傳給info里面10個func函式名和全域變數item=9 info.append(func) info[0]()

#輸出:9

#第二題:
info=[]
def func(i):
def inner():
print(i)
return inner
for item in range(10): #先回圈,每次回圈的結果都被添加到info里面去,0,1,2...9
info.append(func(item)) #這執行了func函式,并把inner回傳給了info串列,而每次的item都不一樣

info[0]() #輸出0

info[1]() #輸出1
info[6]() #輸出6
 

 

高階函式:

  ①對函式名進行賦值  v=func

  ②把函式名當作引數傳遞  def xx(ww):    xx(func)

  ③把函式名當做回傳值回傳    return func

 

4.裝飾器: 

普通裝飾器:

定義:

在不改變原函式內部代碼的基礎上,在函式執行之前和函式執行之后添加某些功能
#裝飾器,習慣上將裝飾器函式命名為wrapper,這里用的是func,內部函式習慣命名為inner
def func(arg):
    def inner():
        print('before')
        res=arg()
        print('after')
        return res
    return inner

#被裝飾器裝飾的函式@func是簡寫,原來是
# v=func(index)
# index=v
# 或者直接寫成:index=func(index)
@func
def index():
    print('123')
    return '666'

print(index)
# 此時輸出為:<function func.<locals>.inner at 0x03A51150>,表示index現在
# 是func函式中的一個內部函式inner,index不再是以前的index函式了,原來的index函式已經傳進去賦值給了arg了

print(index())#在執行原來的index函式之前會輸出before,結束后會輸出after,
# 而index的回傳值一定是在after之后再輸出,注意看代碼的執行順序
# 輸出:
# before
# 123
# after
# 666

# 裝飾器的功能:
# 第一步:執行func函式(就是裝飾器函式),并且將被裝飾的函式的函式名當做引數傳遞到裝飾器中,相當于:func(index)
# 第二步:將func函式的回傳值inner賦值給被裝飾器裝飾的函式的函式名(此時這個函式名已經不能呼叫原來被裝飾的函式了,而是inner函式了).這一步操作相當于 index=func(index)

 

格式:

裝飾器的撰寫格式:

def 外層函式(引數):
    def 內層函式(*args,**kwargs):
        return 引數(*args,**kwargs)
    return 內層函式
裝飾器應用格式: @外層函式
def index(): pass index()

內層函式用
*args,**kwargs接收引數:
這樣你的裝飾器可以接收沒有引數的函式,有一個引數或者多個引數的裝飾器都行.


 

 

帶引數的裝飾器:

帶引數的裝飾器本質就是在原來的裝飾器外邊再加個函式.

因為原來的裝飾器中@只能寫一個引數,就是裝飾器的函式名,所以用帶引數的裝飾器來增加你需要的引數,就是在執行裝飾器之前,先執行一個函式,用這個函式把引數傳到裝飾其中(例如在裝飾其中執行n次被裝飾的函式,這個n就得是帶引數的裝飾器傳進去的n)

#執行n次被裝飾的函式
def x(n):
    print('x函式')
    def wrapper(arg):
        print('wrapper函式')
        def  inner(*args,**kwargs):
            print('inner函式')
            res=''
            for i in range(n):
                res = arg()
                print('這是執行第(',i+1,')次啦!')
            return res
        return inner
    return wrapper

@x(9)#傳的引數就是9
def index():
    print('123')
    return '666'

print(index())


#只回傳第n次執行的回傳值
def x(n):
    print('x函式')
    def wrapper(arg):
        print('wrapper函式')
        def  inner(*args,**kwargs):
            print('inner函式')
            for i in range(n):
                res = arg()
            return res
        return inner
    return wrapper
@x(9)
def index():
    print('123')
    return '666'

print(index())

 

多個裝飾器裝飾一個函式:

這里常考的其實就是執行順序.把執行順序看明白了就好了.(順序就是一條龍,跟考試貼座位號是一個道理)

一個函式正上方有多個裝飾器時,先執行離被裝飾函式最近的裝飾器(如下圖,執行順序一定是3,2,1)

 

但是執行的位置要注意

  ①外層函式(wrapper內的代碼)順序分別是3-2-1,此時一條龍走到了1

  ②內層函式(inner函式內,到被裝飾函式f之前的代碼),1-2-3,此時一條龍走到了3

  ③執行被裝飾的函式f,此時還在3

  ④執行inner函式中被裝飾函式下面的代碼,3-2-1

 

def wrapper1(f):
    print("我是wrapper1")
    def inner1():
        print("我是wrapper1的開始")
        f()
        print("我是wrapper1的結束")
    return inner1
def wrapper2(f):         # f=func()
    print("我是wrapper2")
    def inner2():
        print("我是wrapper2的開始")
        f()
        print("我是wrapper2的結束")
    return inner2

def wrapper3(f):
    print("我是wrapper3")
    def inner3():
        print("我是wrapper3的開始")
        f()
        print("我是wrapper3的結束")
    return inner3
@wrapper1
@wrapper2
@wrapper3
def func():
    print('我是被裝飾的函式!')
func()

輸出:
我是wrapper3
我是wrapper2
我是wrapper1
我是wrapper1的開始
我是wrapper2的開始
我是wrapper3的開始
我是被裝飾的函式!
我是wrapper3的結束
我是wrapper2的結束
我是wrapper1的結束

@wrapper1拆開:func=wrapper1(func) wrapper1裝飾的是前兩個wrapper裝飾過的inner
@wrapper2拆開:func=wrapper2(func)   wrapper2裝飾的其實是wrapper3裝飾過的inner
@wrapper3拆開:func=wrapper3(func)   wrapper3裝飾的其實就是內層的inner

 

5.單例模式

定義:單例模式,是一種常用的軟體設計模式,在它的核心結構中只包含一個被稱為單例的特殊類,通過單例模式可以保證系統中,應用該模式的類一個類只有一個實體,即一個類無論實體化多少次都只有一個物件實體,

白話定義:一個類,實體化多少次出來的物件都是一個,就像賦值一樣,一個實體化物件,但是可以有多個名字,但是他們(這些名字)都指一個實體化物件.

 

實體化物件干了三件事:

  1. 類名加()自動執行object類中的__new__方法,產生并回傳一個物件空間

  1. 執行__init__方法,將物件空間傳給self.

  1. __init__方法中給物件封裝基礎屬性

 

應用場景:Django的admin.py和settings檔案

  ①admin.py:每個應用都有一個admin.py.但是修改每一個admin的內容后,所有的應用的admin內容都會加載,出來,證明他們都用的一個admin.py

    ②settings.py:是因為原始碼中把settings檔案內容都寫到一個類中,實體化物件,再呼叫物件,from xxx import settings檔案第一次會把settings檔案的內容加載到記憶體中,后面無論from xxx import settings多少次都是直接在記憶體中直接拿,而不是再次實體化物件,隨意每次用的

settings檔案的內容都是一個物件出來的內容.

 

 

正規版單例模式:(單例模式的類最好都用singleton做為類名,singleton就是單例模式的意思)

#正規版單例模式(new+鎖+執行緒)import threading
#類名都用singleton,是單例的意思
class Singleton(object):
        instance = None
        lock = threading.RLock()  #鎖放類里面當屬性
        
        def __new__(cls, *arg, **kwargs):
                if cls.instance:
                        return cls.instance
                with cls.lock:             #用類去呼叫鎖
                        if not cls.instance:
                                cls.instance = object.__new__(cls)
                        return cls.instance
                
def task():
    obj = Singleton()
    print(obj)

for i in range(10):
    t = threading.Thread(target=task)
    t.start()

 

面試版單例模式:

 

#面試時可以去掉執行緒(new+鎖)鎖一定要有
import threading

class Singleton(object):
        instance = None
        lock = threading.RLock()
        
        def __new__(cls, *args, **kwargs):
                if cls.instance:
                        return cls.instance
                with cls.lock:
                        if not cls.instance:
                                cls.instance = object.__new__(cls)#這里object中傳的引數cls就是Singleton類,如果把cls換成Singleton也是可以的
                        return cls.instance
                
obj1 = Singleton()
obj2 = Singleton()

 

檔案版單例模式:

#呼叫檔案時也是單例模式:
#在xx.py檔案中:
class Singleton(object):
    def __init__(self):
        self.names = []

    def fun(self):
        pass
site = Singleton()


在另一個與其相鄰的www.py檔案中:
import xx    #第一次import會從檔案中讀取,放到記憶體中

print(xx.site)


import xx #第二次import會直接從記憶體中拿,而不再是用import讀檔案,所以就是單例模式,無論用多少次import都是第一次讀的內容
print(xx.site)

 

錯誤版單例模式:

class Singleton(object):  
        instance = None

        def __init__(self):
                self.name = None

        def __new__(cls, *arg, **kawrgs):
                if not cls.instance:
                        cls.instance = object.__new__(cls)
                return cls.instance

這個單例模式有問題,每次實體化物件,都會在init把上一個物件的內容全部清空,再寫內容,所以,這個單例模式不能給里面傳引數,只能實體化物件,沒有其他屬性添加進去.

 

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

標籤:Python

上一篇:Python爬蟲之Xpath怎么操作,正確的案例詳解

下一篇:python語言Tkinter的Button組件

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