自學Python3.1-函數基礎

自學Python之路-Python基礎+模塊+面向對象
自學Python之路-Python網絡編程
自學Python之路-Python併發編程+數據庫+前端
自學Python之路-django
html

1、函數概述

1. 簡介

  函數是組織好的,可重複使用的,用來實現單一,或相關聯功能的代碼段。函數能提升應用的模塊性,和代碼的重複利用率前端

2. 組成

  • 函數代碼塊以 def 關鍵詞開頭,後接函數名和圓括號()
  • 任何傳入參數和自變量必須放在圓括號中間。圓括號之間能夠用於定義參數。
  • 函數的第一行語句能夠選擇性地使用文檔字符串—用於存放函數說明。
  • 函數主體部分:函數內容以冒號起始,而且縮進。
  • 函數結束部分:return [表達式] 結束函數,選擇性地返回一個值給調用方。不帶表達式的return至關於返回 None。 函數是一個功能塊,該功能到底執行成功與否,須要經過返回值來告知調用者。
def functioname函數名(parameters參數)
     " 文檔字符串 "
     函數體
     return()返回值

3. 簡單調用

  以上邊的示例爲例,調用方法很簡單執行以下代碼。python

         functionname(參數) 數據庫

  注意,函數定義好以後,並不會運行。只有在調用的時候會運行django

def cal():
    n=123
    n+=1
    print(n)
cal() #執行函數
c=cal # 變量C指向函數cal
c() # 同cal()同樣

輸出編程

124
124數組

2、函數組成部分

2.1 函數的命名

  函數名應該爲小寫,能夠用下劃線風格單詞以增長可讀性。如:myfunction,my_example_function。網絡

       Python之父Guido推薦的命名規範包括以下幾點:
           ①模塊名和包名採用小寫字母而且如下劃線分隔單詞的形式;
           ②類名採用以大寫字母開頭,而且以大寫字母分隔單詞的形式命名;
           ③全局或者類常量,所有使用大寫字母,而且如下劃線分隔單詞;其他變量命名則是採用所有小寫字母,而且如下劃線分隔單詞的形式命名。
           ④以上的內容若是是內部的,則使用下劃線開頭命名。數據結構

2.2 函數參數

      形參:def函數後面的變量,()內的變量
      實參:調用函數時候用的值,也叫參數併發

import smtplib
from email.mime.text import MIMEText
from email.utils import formataddr
def mail(user):
    ret=True
    try:
       msg = MIMEText('郵件內容', 'plain', 'utf-8')
       msg['From'] = formataddr(["carlos", 'carlos@126.com'])
       msg['To'] = formataddr(["carlos_chiang", user])
       msg['Subject'] = "主題"
       server = smtplib.SMTP("smtp.126.com", 25)
       server.login("carlos@126.com", "郵箱密碼")
       server.sendmail('carlos@126.com', [user, ], msg.as_string())
       server.quit()
    except Exception:
        ret=False
    return ret
ret=mail('422417945@qq.com')
ret=mail('422417946@qq.com')
ret=mail('422417947@qq.com')
if ret:
    print('發送成功')
else:
    print('發送失敗')

經過定義參數,能夠給3我的發送郵件,簡化了代碼。

參數如何使用?
①無參數def  show():
               show()

②一個參數def show(arg)
                 show('aaaa')

③二個參數def show(arg,chr)
                 show('aaaa','bbbbb')         (若只賦值一個參數,會報錯)

   .......

 

函數的參數分爲三類:默認參數、指定參數、可變參數

2.2.1 默認參數    必須放置在最後

1. 在函數中默認參數賦值a, 在函數外若該參數無賦值,將直接採用賦值a ;

2. 在函數中默認參數賦值a,在函數外若該參數賦值b,將採用賦值b

def show(a,b=100): # 默認參數b=100       這種寫法錯誤def show(a=111,b):
     print(a,b)
show(200) # 只有一個賦值,默認是給第一個賦值

輸出200 100

def show(a,b=100): 
    print(a,b)
show(200,300)

輸出200 300

2.2.2 指定參數

def functionname(name,age=18):
   print("I'm %s, age %s" % (name, age))
functionname(age=26,name="carlos")  #上述默認age參數爲18,若是這裏不指定age的話,默認會使用18,可是若是咱們指定參數的話,優先會執行咱們指定的參數值。

 輸出 I'm carlos, age 26 

2.2.3 可變參數

2.2.3.1 可變參數 *    把全部賦值的參數變成元素

舉例1

def function_name(*args):
     print(args, type(args))
function_name(1)
function_name(1,2,3)

輸出

(1,) <class 'tuple'>
(1, 2, 3) <class 'tuple'>

由此能夠看出,默認將傳入的參數,所有放在元組中,即args = (...),在執行()的時候,會進行tuple.__init__方法。

舉例2

def function_name(*args):
     print(args, type(args))
function_name(1,2,3)
function_name(*'wzg')
function_name(*['jack','tony'])

今後能夠看出,能夠看出帶*的參數,會循環變量中的每一個元素加入至tuple中。字符串的話循環每一個字母。若是傳入的是個列表或者元組,返回的是列表,元組中的每一個元素。class類型都是做爲'tuple'返回。

舉例3

def function_name(*args):
    for name in args:
        print(name,type(name))
function_name('liupeng','jack',11,22,['a','b','c'])

輸出

liupeng <class 'str'>
jack <class 'str'>
11 <class 'int'>
22 <class 'int'>
['a', 'b', 'c'] <class 'list'>

基於*args案例的基礎上添加了for循環語句,循環的是args中的每一個元素並顯示元素的類型。從上例能夠看出*接收的不光能夠是一個字符串,還能夠是數字或者列表。

2.2.3.2 可變參數 **   把全部賦值的參數變成字典, 參數的格式必須是有key value
舉例1

def function_name(**args):
    print(args,type(args))
function_name(name = 'wzg',job = "IT")  #key1=name value=wzg  key2=job value=IT

輸出
{'name': 'wzg', 'job': 'IT'} <class 'dict'>
舉例2

dic = {'k1':'v1','k2':'v2'}
def function_name(**dic):
    print(dic)
function_name(**dic)

輸出
{'k1': 'v1', 'k2': 'v2'}  

舉例3

dic = {'k1':'v1','k2':'v2'}
def function_name(**dic):
    print(dic)
function_name(di=dic)

輸出
{'di': {'k1': 'v1', 'k2': 'v2'}}

分析以上3個例子的結果:

①函數自己不用多說,當咱們在第一次調用函數時由於參數咱們指定了(name跟job的)參數所以打印時候直接輸出了字典keys爲name跟job,values爲wzg,IT即 {'name': 'wzg', 'job': 'IT'} <class 'dict'>。

②在第二次調用函數時,會發現咱們此次調用函數()中傳的參數也是**的方式。這裏提早建立了一個dic的字典並把它做爲函數的參數使用。結合**的用法,使得字典中每一個元素做爲參數傳到函數中被調用。

    即{'k2': 'v2', 'k1': 'v1'} <class 'dict'>。

③最後一次調用函數時,咱們參數是這麼指定的(di = dic),這裏能夠看出跟1的使用方法相同。對了,沒錯。此次只不過是咱們把整個dic做爲了字典中的values來傳入函數了而di作爲了字典中的key。即

 {'di': {'k2': 'v2', 'k1': 'v1'}} <class 'dict'>

總結:上面1-3無論那一種的類型最終都是<class 'dict'>也就是說**args,或者**其餘什麼變量最終生成的結果都是以字典的方式呈現。而*args最終都是以元組的方式呈現。

2.2.3.3 可變參數  *   **   (兩個一塊兒使用)
    ①必須* 在前  ,**在後
    ②賦值的時候必須元組在前,字典在後

def show(*args,**kwargs):
    print(args,type(args))
    print(kwargs,type(kwargs))
show(11,22,33,44,n1=88,carlos='boy')
def show(*args,**kwargs):
    print(args,type(args))
    print(kwargs,type(kwargs))
i=[11,22,33,44]
j={'n1':88,'carlos':'boy'}
show(*i,**j)

以上均輸出

(11, 22, 33, 44) <class 'tuple'>
{'n1': 88, 'carlos': 'boy'} <class 'dict'>

def show(*args,**kwargs):
    print(args,type(args))
    print(kwargs,type(kwargs))
i=[11,22,33,44]
j={'n1':88,'carlos':'boy'}   #若是這樣定義,至關於將i,j都放到args中,結果致使kwargs 字典爲空
show(i,j)

輸出

([11, 22, 33, 44], {'n1': 88, 'carlos': 'boy'}) <class 'tuple'>
{} <class 'dict'>  

2.3 函數註釋

  Python有一種獨一無二的的註釋方式: 使用文檔字符串. 文檔字符串是包, 模塊, 類或函數裏的第一個語句.。這些字符串能夠經過對象的__doc__成員被自動提取, 而且被pydoc所用。
       
     函數註釋包含如下幾個部分:

  1.總體功能說明  2.輸入參數說明  3.輸出/返回值說明  4.異常說明  5.其餘

2.4 函數主體

  函數主體部分就是代碼邏輯的實現/處理過程。

2.5 函數返回值

  ①函數返回值是一個可選的選項,能夠返回一個表達式、某種數據結構等
       ②默認返回None輸出

import smtplib
from email.mime.text import MIMEText
from email.utils import formataddr
def mail():
    ret=True
    try:
       msg = MIMEText('郵件內容', 'plain', 'utf-8')
       msg['From'] = formataddr(["carlos", 'carlos@126.com'])
       msg['To'] = formataddr(["carlos_chiang", '422417945@qq.com'])
       msg['Subject'] = "主題"
       server = smtplib.SMTP("smtp.126.com", 25)
       server.login("carlos@126.com", "郵箱密碼")
       server.sendmail('carlos@126.com', ['422417945@qq.com', ], msg.as_string())
       server.quit()
    except Exception:
        ret=False
    return ret
ret=mail()
print(ret)

輸出

False         (緣由爲‘郵箱密碼’,若輸入正確密碼,則輸出爲True)  

在函數或者類中,若出現return,後續代碼不執行。

def show():
    print('a')
    return([11,22])
    print('b')
s=show()

輸出a

3、斷點調試,查看代碼執行順序

1. 在左側設置斷點

2. 若是使用斷點,採用debug模式運行

3. 一步一步執行代碼,,單擊console查看輸出結果

相關文章
相關標籤/搜索