5.0 Python 定義并使用函數

函數是python程序中的基本模塊化單位,它是一段可重用的代碼,可以被多次調用執行。函數接受一些輸入參數,并且在執行時可能會產生一些輸出結果。函數定義了一個功能的封裝,使得代碼能夠模塊化和組織結構化,更容易理解和維護。在python中,函數可以返回一個值或者不返回任何值,而且函數的參數可以是任何python對象,包括數字、字符串、列表、元組等。python內置了許多函數,同時也支持用戶自定義函數。

Python 中可以創建這樣四種類型的函數:

  • 全局函數:定義在模塊
  • 局部函數:嵌套于其它函數中
  • lambda函數:表達式,如需多次調用
  • 方法:與特定數據類型關聯的函數,并且只能與數據類型關聯一起使用

函數創建的相關定義規則:

  • 函數代碼塊以def關鍵詞開頭,后接函數標識符名稱和圓括號()
  • 任何傳入參數和自變量必須放在圓括號中間,圓括號之間可以用于定義參數
  • 函數的第一行語句可以選擇性地使用文檔字符串,-用于存放函數說明
  • 函數內容以冒號起始,并且必須保持縮進,否則會當作普通語句來執行
  • return [表達式] 結束函數,選擇性地返回一個值給調用方,也就是返回值

5.1 有參與無參函數

Python是一種支持函數編程的編程語言。在Python中,函數可以分為有參函數和無參函數。有參函數接受零個或多個參數,并執行操作或返回一個值。無參函數則根本不需要任何參數。通常,有參函數通過其參數來接受外部數據,以便在函數執行時進行操作或返回結果。而無參函數則只提供在函數代碼中預定義的代碼塊。因此,無論是有參函數還是無參函數,它們都是Python編程中非常重要的組成部分,具有廣泛的用途。

定義無參函數: 如下我們編寫一個無參數的函數,并在后面直接調用其執行.

>>> import sys
>>> 
>>> def lyshark():                 #定義lyshark()函數,函數執行打印
...     print("hello lyshark!")
>>> 
>>> lyshark()                      #調用了lyshark()函數,打印一段話
hello lyshark!
>>> 

定義有參函數: 如下我們編寫兩個函數,分別給予相應的參數,其返回值則不相同.

>>> import sys
>>> 
>>> def area(width,height):       #一個計算面積的函數,其中width,height是形式參數
...     return width * height
>>> 
>>> def print_me(name):           #一個打印函數,其中name是形式參數
...     print("welcome:",name)
>>> 
>>>   
>>> print_me("lyshark")           #調用打印函數,并摻入相應的數值
welcome: lyshark
>>> 
>>> w=10
>>> h=25
>>> print(area(w,h))              #計算平方并打印,傳入數值變量計算
250

5.2 函數參數傳遞

默認情況下,參數通過其位置進行傳遞,從左至右,這意味著,必須精確地傳遞和函數頭部參數一樣多的參數,但也可以通過關鍵字參數、默認參數或參數容器等改變這種機制.

通常python中所支持的參數傳遞形式:

  • 普通參數:普通參數傳遞,在定義函數時就指定了規律是從左至右傳遞
  • 默認參數:定義函數時是使用"name=value"的語法直接給變量一個值,從而傳入的值可以少于參數個數
  • 指定參數:調用函數時指定"name形式參數=value實際參數"的語法通過參數名進行匹配
  • 動態參數:在我們定義函數時,形式參數中收集任意多基于普通參數
    【定義函數時使用* :收集普通參數,返回元組,*args】【定義函數時使用**:收集指定參數,返回列表,**kwargs】
  • 動態參數解包:在調用函數時,使用**開頭的參數,從而傳遞任意多基于普通或指定參數

關于函數中形式參數與實際參數的區別:

  • 形式參數:形參變量只有在被調用時才分配內存單元,在調用結束時,即刻釋放所分配的內存單元.因此,形參只在函數內部有效.函數調用結束返回主調用函數后則不能再使用該形參變量
  • 實際參數:實參可以是常量、變量、表達式、函數等,無論實參是何種類型的量,在進行函數調用時,它們都必須有確定的值,以便把這些值傳送給形參.因此應預先用賦值,輸入等辦法使參數獲得確定值

普通參數傳遞: 定義一個函數體,并且為其傳遞三個參數,執行函數并打印結果.

>>> def stu(name,age,country):
...     print("姓名:",name)
...     print("年齡:",age)
...     print("國籍:",country)>>> stu("lyshark",22,"CN")
姓名: lyshark
年齡: 22
國籍: CN
>>>
>>> stu("zhangsan",33,"CN")
姓名: zhangsan
年齡: 33
國籍: CN

帶默認參數傳遞: 同樣的,我們可以給指定的字段添加默認參數,如果用戶不輸入則默認使用指定參數,此處需要注意:如果您要使用帶默認參數的函數,則需要把帶參數的字段,放在函數最后一項.

>>> def stu(age,country,name="none",sex="man"):
...     print("姓名: ",name)
...     print("性別: ",sex)
...     print("年齡: ",age)
...     print("國籍: ",country)
...
>>>
>>> stu(23,"CN","lyshark","man")    #此時我們給予全部的參數則無默認值
姓名:  lyshark
性別:  man
年齡:  23
國籍:  CN
>>> stu("zhangsan","mal",23,"CN")   #形參如何排列,實參就得如何排列
姓名:  23
性別:  CN
年齡:  zhangsan
國籍:  mal
>>> stu(23,"CN")                    #傳遞輸入是忽略帶有默認值的字段
姓名:  none
性別:  man
年齡:  23
國籍:  CN

動態參數傳遞(傳遞列表): 若你的函數在定義時不確定用戶想傳入多少個參數,就可以使用非固定參數,傳遞一個列表.

>>> def stu(name,age,*args):                  #*args會把多傳入的參數變成一個元組.
...     print(name,age,args)
>>>
>>> stu("lyshark",22)
lyshark 22 ()                                 #這個()就是args,只是因為沒傳值,所以為空.
>>> 
>>> stu("lyshark",22,"a","b","c","d")         #傳值后會把它當作一個列表
lyshark 22 ('a', 'b', 'c', 'd')
>>> 
>>> ls=[1,2,3,4,5]                             #先聲明列表
>>> stu("lyshark",22,ls)                       #傳遞這個列表
lyshark 22 ([1, 2, 3, 4, 5],)                  #第三個值,打印出列表

執行函數時有·*,則把所有迭代對象拆分為單個元素作為元組的元素,如傳入列表,會把列表中每一個元素遍歷添加到元組中當作一個元素,如下可看到差別.

>>> def fun(*args):                          #動態參數返回元組
...     print(args,type(args))
>>>
>>> lists=[1,2,3,4]                          #定義要傳遞的列表
>>> fun(lists)                               #傳遞一個列表
([1, 2, 3, 4],) <class 'tuple'>
>>> 
>>> fun(*lists)
(1, 2, 3, 4) <class 'tuple'>

動態參數傳遞(傳遞字典): 我們可以使用**kwargs默認參數,來接收一個字典,并通過函數體打印出來.

>>> def stu(name,age,*args,**kwargs):
...     print(name,age,args,kwargs)
>>> 
>>> stu("lyshark",22)                                     #傳遞默認參數
lyshark 22 () {}
>>> 
>>> stu("lyshark",22,"a","b",sex="Male",province="山東")  #傳遞元組和字典
lyshark 22 ('a', 'b') {'sex': 'Male', 'province': '山東'}

如上方法是在調用函數的時候傳遞的字典,當然我們也可以直接將一個現有的字典傳遞進去.

>>> def fun(name,**kwargs):
...     print(name,kwargs)
>>>
>>> dic={"k1":"v1","k2":"v2"}
>>> 
>>> fun("lyshark",**dic)
lyshark {'k1': 'v1', 'k2': 'v2'}

動態參數傳遞(萬能參數): 我們使用*與**通常情況下可以傳遞任何值,所以稱作萬能參數.

>>> def fun(*args,**kwargs):
...     print(args,type(args))
...     print(kwargs,type(kwargs))
>>>
>>> lists=[1,2,3,4,5,6,7,8,9]
>>> dic={"a":1001,"b":1002,"c":1003}
>>> 
>>> fun(*lists,**dic)
(1, 2, 3, 4, 5, 6, 7, 8, 9) <class 'tuple'>
{'a': 1001, 'b': 1002, 'c': 1003} <class 'dict'>

拓展補充: 其實在python中我們經常看到萬能參數,比如str.format()方法,就是一個典型的萬能參數的例子,如下演示,了解即可.

>>> string="hello {0},age {1}"
>>> print(string.format("lyshark",22))
hello lyshark,age 22
>>> 
>>> string="hello {name},age {age}"
>>> print(string.format(name="lyshark",age=22))
hello lyshark,age 22
>>> 
>>> string="hello {0},age {1}"
>>> print(string.format(*["lyshark",22]))
hello lyshark,age 22
>>> 
>>> dic ={"name":"lyshark","age":22}
>>> string="hello {name},age {age}"
>>> 
>>> print(string.format(**dic))
hello lyshark,age 22

在多個同名函數的情況下,默認使用最后后一個函數,最后一個函數名會指向新的內存對象,函數名是函數體在內存中的引用.

>>> def fun(a,b):
...     return a+b
>>> def fun(a,b):
...     return a*b
>>> 
>>> print(fun(3,3))
9

函數傳遞的是指針,所以我們的數據會被保留下來如下例子.

>>> def fun(x):
...     x.append(8888)
>>> 
>>> lists=[1,2,3]
>>> fun(lists)
>>> 
>>> print(lists)
[1, 2, 3, 8888]

如下例子由于函數沒有定義返回值,所以默認為none.

>>> def fun(x):
...     x.append(8888)
>>>
>>> lists=[1,2,3]
>>> lists=fun(lists)
>>> 
>>> print(lists)
None

5.3 通用函數返回值

return語句用來實現退出函數,選擇性地向調用方返回一個表達式,不帶參數值的return語句返回None,之前的例子都沒有示范如何返回數值,如下先來看一下返回語句的規則:

  • Return 語句用于退出函數,選擇性地向調用方返回一個表達式
  • 如果Return語句不帶任何參數,則不帶參數值的Return語句默認返回None
  • 函數在執行過程中只要遇到Return,就會停止執行并返回結果,通俗的將遇到ret說明函數結束

默認函數返回: 如下使用默認函數返回,通常情況下返回一個確定數值.

>>> def add(num1,num2):
...     sum=num1+num2
...     print("函數內返回:",sum)
...     sum=sum+100
...     return sum
>>>
>>> temp=add(10,20)
函數內返回: 30
>>> print("函數外返回:",temp)
函數外返回: 130

選擇性返回: 在函數體內部使用判斷結構,如果輸入的是偶數返回0,否則返回-1.

>>> def check(num):
...     if (num %2 ==0):
...         return 0
...     else:
...         return -1
>>>
>>> print(check(2))
0
>>> print(check(3))
-1

返回一個列表: 通過函數體的運算后,將一個列表返回給外部來接收使用.

import osdef temp_max(*args):all_max=[]temp=argsfor x in range(len(*args)):if temp[0][x] >= 50:all_max.append(temp[0][x])return all_maxa=[11,56,87,99,86,34,56,22,77,53]
my_max=[]my_max=temp_max(a)
print(my_max)

5.4 通用函數閉包

函數是一段可執行代碼,編譯后就固化了,每個函數在內存中只有一份實例,得到函數的入口點便可以執行函數了,一個函數可作為另一個函數的參數或返回值,可以賦給一個變量.函數可以嵌套定義,即在一個函數內部可以定義另一個函數,有了嵌套函數這種結構,便會產生閉包問題.

閉包是由函數及其相關的引用環境組合而成的實體(閉包=函數+引用環境)這個從字面上很難理解,python中的閉包從表現形式上定義(解釋)為:如果在一個內部函數里,對在外部作用域(但不是在全局作用域)的變量進行引用,那么內部函數就被認為是閉包(closure).這個定義是相對直白的,好理解的,下面舉一個簡單的例子來說明.

>>> def adds(x):
...     def adder(y):return x+y
...     return adder
...
>>> c=adds(10)
>>> type(c)
<class 'function'>
>>> c.__name__
'adder'
>>> c(10)
20

如上代碼,在一個內部函數里:adder(y)就是這個內部函數,對在外部作用域(但不是在全局作用域)的變量進行引用:x就是被引用的變量,x在外部作用域adds里面,但不在全局作用域里,則這個內部函數adder就是一個閉包.閉包=函數塊+定義函數時的環境,adder就是函數塊,x就是環境,當然這個環境可以有很多,不止一個簡單的x.

閉包返回函數: 通過使用閉包,返回一個函數,并使用函數做進一步的計算.

import osdef post_sum(*args):def sum():x=0for y in args:x=x+yreturn xreturn sumpost_sum(1,2,3,4,5)    #post_sum并沒執行,而是返回一個指向求和的函數的函數名sum的內存指針fp=post_sum(1,2,3,4,5) 
print(type(fp))        #調用f()函數,才真正調用了sum函數進行求和,這其實就是閉包print(fp())

閉包選擇返回: 通過返回值判斷,來使用不同的閉包函數,從而返回不同的結果.

import osdef post(temp,*args):def sum():x=0for y in args:x=x+yreturn xdef div():x=1for y in args:x=x*yreturn xif temp=="1":return sumelse:return divfp=post("1",1,2,3,4)     #使用加法閉包函數
print(type(fp))
print(fp())fp1=post("0",1,2,3,4)    #使用乘法閉包函數
print(type(fp1))
print(fp1())

閉包返回函數列表: 通過使用閉包函數,一次性返回多個函數列表,每個函數擁有獨立空間.

>>> def count():fs=[]for i in range(1,4):def f():return i*ifs.append(f)return fs>>> f1,f2,f3=count()
>>> print(f1())
9
>>> print(f2())
9
>>> print(f3())
9

5.5 函數嵌套與遞歸

除了函數的閉包以外,函數還支持兩種調用方式,一種是嵌套函數,另一種是遞歸函數,這里需要注意的是,最好在開發中盡量少用這樣的結構,這種結構一旦層數變多將很難后期進行維護,所以你懂的.

  • 嵌套函數:即指在一個函數體中,嵌套另外一個函數體,內部函數執行后將結果返回給外部函數使用
  • 遞歸函數:函數在其內部調用它自己,就叫做遞歸,但遞歸需設置退出條件,不然會一直遞歸下去,變成一個死循環

嵌套函數: 定義一個嵌套函數,并打印出其執行軌跡,并理解其原理.

import osname="lyshark"def chage_name():name="lyshark blog"def chage_name_new():name="mkdirs blog"print("第3層循環打印: ",name)chage_name_new()              #在函數內部調用內部的函數print("第2層循環打印: ",name)  #第二層函數執行結果chage_name()                      #調用最外層函數
print("查看最外層變量: ",name)     #查看外層變量>>>3層循環打印:  mkdirs blog
第2層循環打印:  lyshark blog
查看最外層變量:  lyshark

遞歸函數: 使用遞歸的方式實現指定數字的階乘,如下所示.

import osdef fun(n):if 0==n:              # n=0 的話直接返回空,對用戶輸入的零進行判斷return Noneelif 1==n:            # n=1 的話就不再遞歸return nelse:return n*fun(n-1) # 遞歸在執行f(n-1),直到f(1)print(fun(5))             # 120
'''f(5)的執行過程如下===> f(5)===> 5 * f(4)===> 5 * (4 * f(3))===> 5 * (4 * (3 * f(2)))===> 5 * (4 * (3 * (2 * f(1))))===> 5 * (4 * (3 * (2 * 1)))===> 5 * (4 * (3 * 2))===> 5 * (4 * 6)===> 5 * 24===> 120
'''

5.6 LAMBDA匿名函數

Lambda是Python中的一個關鍵字,用于創建匿名函數。匿名函數是沒有名稱的小函數,通常用于僅需要一次性使用的場景。它們可以被傳遞為參數,或者作為返回值返回給其他函數使用。

Lambda函數的語法很簡單,使用lambda關鍵字定義,后跟參數,并且只能包含一個表達式。該表達式的結果則作為函數返回值。

關于匿名函數的一些注意事項:

  • lambda只是一個表達式,函數體比 def 簡單很多
  • lambda表達式會自動return返回值,條件為真返回True,條件為假返回False
  • lambda函數擁有自己的命名空間,且不能訪問自己參數列表之外或全局命名空間里的參數
  • lambda的主體是一個表達式,而不是一個代碼塊,僅僅能在lambda表達式中封裝有限的邏輯進去
  • lambda函數看起來只能寫一行,卻不等同于C或C++的內聯函數,應該區別對待,畢竟是兩們不同語言.

定義匿名函數: 使用功能最基本的語法定義一個匿名函數.

>>> sum=lambda x,y,z: x+y+z
>>> 
>>> print("三個數相加:",sum(10,20,30))
三個數相加: 60

定義匿名函數: 對于簡單的函數,也存在一種簡便的表示方式,即:lambda表達式.

# ######################### 普通函數 #########################
# 定義函數(普通方式)
def func(arg):return arg + 1# 執行函數
result = func(123)# ######################### lambda ########################## 定義函數(lambda表達式)
my_lambda = lambda arg : arg + 1# 執行函數
result = my_lambda(123)

向匿名函數傳遞列表: 想一個匿名函數傳遞一個列表,并分別計算后返回相應數據.

>>> res=map(lambda x:x**2,[1,5,4,8])
>>> 
>>> for i in res:print(i)1
25
16
64

本文作者: 王瑞
本文鏈接: https://www.lyshark.com/post/be3b076e.html
版權聲明: 本博客所有文章除特別聲明外,均采用 BY-NC-SA 許可協議。轉載請注明出處!

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/34947.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/34947.shtml
英文地址,請注明出處:http://en.pswp.cn/news/34947.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

企業有VR全景拍攝的需求嗎?能帶來哪些好處?

在傳統圖文和平面視頻逐漸疲軟的當下&#xff0c;企業商家如何做才能讓遠在千里之外的客戶更深入、更直接的詳細了解企業品牌和實力呢&#xff1f;千篇一律的紙質材料已經過時了&#xff0c;即使制作的再精美&#xff0c;大家也會審美疲勞&#xff1b;但是你讓客戶遠隔千里&…

(MySQL經驗)之MySQL單表行數最好低于2000w

作為在后端開發&#xff0c;是不是經常聽到過&#xff0c;mysql 單表最好不要超過 2000w,單表超過 2000w 就要考慮數據遷移了&#xff0c;表數據都要到 2000w &#xff0c;查詢速度變得賊慢。 1、建表操作 建一張表 CREATE TABLE person( id int NOT NULL AUTO_INCREMENT PRI…

如何讓ES低成本、高性能?滴滴落地ZSTD壓縮算法的實踐分享

前文分別介紹了滴滴自研的ES強一致性多活是如何實現的、以及如何提升ES的性能潛力。由于滴滴ES日志場景每天寫入量在5PB-10PB量級&#xff0c;寫入壓力和業務成本壓力大&#xff0c;為了提升ES的寫入性能&#xff0c;我們讓ES支持ZSTD壓縮算法&#xff0c;本篇文章詳細展開滴滴…

Python 監控 Windows 服務

Python 監控 Windows 服務 Python 在 Windows 系統上可以使用 wmi 模塊來實現對 Windows 服務的監控。本文將介紹如何使用 Python 監控 Windows 服務&#xff0c;并實現服務狀態的查詢和服務啟停功能。 安裝依賴 在使用 wmi 模塊之前&#xff0c;需要先安裝 wmi包。可以使用…

[excel]vlookup函數對相同的ip進行關聯

一、需求&#xff08;由于ip不可泄漏所以簡化如下&#xff09; 有兩個sheet: 找到sheet1在sheet2中存在的ip&#xff0c;也就是找到有漏洞的ip 二、實現 vlookup函數有4個參數 第一個:當前表要匹配的列&#xff0c;選擇第一個sheet當前行需要處理的ip即可 第二個:第二個shee…

linux內核bitmap之setbit匯編實現

內核版本&#xff1a;kernel 0.12 首先看一段代碼&#xff0c;下面這段代碼來自內核版本0.12的mm/swap.c中&#xff1a; // mm/swap.c #define bitop(name,op) \static inline int name(char * addr,unsigned int nr) \ { \int __res; \__asm__ __volatile__("bt" …

蟻劍antSword-maste下載-安裝-使用-一句話木馬

下載 https://github.com/AntSwordProject/antSword 一句話木馬 hack.php腳本 <?php eval($_POST[attack]);?> 安裝 1、安裝完成后啟動 2、初始化&#xff0c;選擇有源碼的目錄 3、連接

03 什么是預訓練(Transformer 前奏)

博客配套視頻鏈接: https://space.bilibili.com/383551518?spm_id_from=333.1007.0.0 b 站直接看 配套 github 鏈接:https://github.com/nickchen121/Pre-training-language-model 配套博客鏈接:https://www.cnblogs.com/nickchen121/p/15105048.html 預訓練有什么用 機器學…

Linux(Web與html)

域名 DNS與域名&#xff1a; 網絡是基于tcp/ip協議進行通信和連接的 tcp/ip協議是五層協議&#xff1a;應用層–傳輸層—網絡層----數據鏈路層----物理層每一臺主機都有一個唯一的地址標識&#xff08;固定的ip地址&#xff0c;用于區分用戶和計算機。 ip地址&#xff1a;由…

深入淺出:MyBatis的使用方法及最佳實踐

這里寫目錄標題 添加MyBatis框架?持配置連接字符串和MyBatis配置連接字符串配置 MyBatis 中的 XML 路徑 添加業務代碼創建數據庫和表添加用戶實體類添加 mapper 接?添加 UserMapper.xml添加 Service層添加 Controller層 增刪改操作增加操作刪除操作修改操作 添加MyBatis框架?…

JVM 基礎

鞏固基礎&#xff0c;砥礪前行 。 只有不斷重復&#xff0c;才能做到超越自己。 能堅持把簡單的事情做到極致&#xff0c;也是不容易的。 JVM 類加載機制 JVM 類加載機制分為五個部分&#xff1a;加載&#xff0c;驗證&#xff0c;準備&#xff0c;解析&#xff0c;初始化&am…

Hadoop安裝完全分布式搭建

1、安裝Hadoop 上傳Hadoop的指定路徑/root/softwares 解壓安裝 cd /root/softwares && tar -zxvf hadoop-2.7.3.tar.gz -C /usr/local配置環境變量 vim /etc/profile # Hadoop Environment export HADOOP_HOME/usr/local/hadoop-2.7.3 export PATH$PATH:$HADOOP_HOM…

openCV使用c#操作攝像頭

效果如下&#xff1a; 1.創建一個winform的窗體項目&#xff08;框架.NET Framework 4.7.2&#xff09; 2.Nuget引入opencv的c#程序包&#xff08;版本最好和我一致&#xff09; 3.后臺代碼 using System; using System.Collections.Generic; using System.ComponentModel;…

用友-NC-Cloud遠程代碼執行漏洞[2023-HW]

用友-NC-Cloud遠程代碼執行漏洞[2023-HW] 一、漏洞介紹二、資產搜索三、漏洞復現PoC小龍POC檢測腳本: 四、修復建議 免責聲明&#xff1a;請勿利用文章內的相關技術從事非法測試&#xff0c;由于傳播、利用此文所提供的信息或者工具而造成的任何直接或者間接的后果及損失&#…

Leetcode-每日一題【劍指 Offer 24. 反轉鏈表】

題目 定義一個函數&#xff0c;輸入一個鏈表的頭節點&#xff0c;反轉該鏈表并輸出反轉后鏈表的頭節點。 示例: 輸入: 1->2->3->4->5->NULL輸出: 5->4->3->2->1->NULL 限制&#xff1a; 0 < 節點個數 < 5000 解題思路 1.題目要求我們反轉…

Windows下運行Tomcat服務時報GC Overhead Limit Exceeded

根本原因是在新建Tomcat作為Windows服務時&#xff0c;系統默認設置的堆內存太小了&#xff0c;我們打開/bin/service.bat文件&#xff0c;將如下圖所示的默認值改大一些就好了 if "%JvmMs%" "" set JvmMs512 if "%JvmMx%" "" set J…

高防cdn和高防服務器有什么不一樣?

高防cdn&#xff1a; 相信很多看過我們文章的小伙伴對cdn已經很了解了&#xff0c;cdn的原理很簡單&#xff0c;就是構建在網絡上的很多個節點&#xff0c;為網站作內容 分發。使用戶就近獲取所需資源。且分配的cdn節點都是高防節點&#xff0c;每個節點都有防御功能。還…

【考研復習】24王道數據結構課后習題代碼|第3章棧與隊列

文章目錄 3.1 棧3.2 隊列3.3 棧和隊列的應用 3.1 棧 int symmetry(linklist L,int n){char s[n/2];lnode *pL->next;int i;for(i0;i<n/2;i){s[i]p->data;pp->next;}i--;if(n%21) pp->next;while(p&&s[i]p->data){i--;pp->next;}if(i-1) return 1;…

Python flask-restful 框架講解

1、簡介 Django 和 Flask 一直都是 Python 開發 Web 的首選&#xff0c;而 Flask 的微內核更適用于現在的云原生微服務框架。但是 Flask 只是一個微型的 Web 引擎&#xff0c;所以我們需要擴展 Flask 使其發揮出更強悍的功能。 python flask框架詳解&#xff1a;https://blog.…

sentinel簡單使用

核心demo&#xff1a; 1 引入依賴: <dependency><groupId>com.alibaba.csp</groupId><artifactId>sentinel-core</artifactId><version>1.8.0</version> </dependency>2 核心代碼&#xff1a; 3 限流保護代碼&#xff1a;…