程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式師世界 >> 編程語言 >  >> 更多編程語言 >> Python

Python學習二(函數)

編輯:Python

1.def

        在Python中,定義一個函數需要使用 def 語句,def 後寫出函數名括號參數冒號:,然後在縮進塊中編寫函數體,函數返回值用return語句返回

#def
def test_func(data):
if(data):
print(data)
else:
print('NULL')
test_func('hello')
test_func(0)
結果:
hello
NULL

2.pass

        pass是一個空指令,當定義了一個函數,但是又沒有想好要寫什麼內容,可以在函數中直接寫pass,讓整個代碼先跑起來。在一些判斷語句中pass也同樣適用。

#函數
def test_func2(data):
pass
#判斷
if data > 0:
pass

3.isinstance

        isinstance的意思是“判斷類型”,是一個內置函數,用於判斷一個對象是否是一個已知的類型。返回結果為Bool類型。

def test_func(data):
if not isinstance(data,(int,float)):
print("false type")
test_func('hello')
結果:false type

4.raise

        很多時候需要在程序中添加異常報警。比如對類型判斷的時候,如果類型出錯,只是打印一句LOG是非常不明顯的。此時就可以使用raise語句來拋出異常

def test_func(data):
if not isinstance(data,(int,float)):
raise TypeError('false type')
test_func('hello')
結果:
Traceback (most recent call last):
File "d:/python/test_project/test.py", line 21, in <module>
test_func('hello')
File "d:/python/test_project/test.py", line 9, in test_func
raise TypeError('false type')
TypeError: false type

        這裡TypeError是系統內置的異常類型,還有其他很多的類型,可以根據需求自己選擇。

class SystemError(_StandardError): ...
class TypeError(_StandardError): ...
class ValueError(_StandardError): ...
class FloatingPointError(ArithmeticError): ...
class OverflowError(ArithmeticError): ...
class ZeroDivisionError(ArithmeticError): ...
class ModuleNotFoundError(ImportError): ...
class IndexError(LookupError): ...
class KeyError(LookupError): ...
class UnboundLocalError(NameError): ...
class BlockingIOError(OSError):
characters_written: int
class ChildProcessError(OSError): ...
class ConnectionError(OSError): ...
class BrokenPipeError(ConnectionError): ...
class ConnectionAbortedError(ConnectionError): ...
class ConnectionRefusedError(ConnectionError): ...
class ConnectionResetError(ConnectionError): ...
class FileExistsError(OSError): ...
class FileNotFoundError(OSError): ...
class InterruptedError(OSError): ...
class IsADirectoryError(OSError): ...
class NotADirectoryError(OSError): ...
class PermissionError(OSError): ...
class ProcessLookupError(OSError): ...
class TimeoutError(OSError): ...
class NotImplementedError(RuntimeError): ...
class RecursionError(RuntimeError): ...
class IndentationError(SyntaxError): ...
class TabError(IndentationError): ...
class UnicodeError(ValueError): ...

        當然,也可以不設置異常類型

def test_func(data):
if not isinstance(data,(int,float)):
raise
test_func('hello')
結果:
Traceback (most recent call last):
File "d:/python/test_project/test.py", line 22, in <module>
test_func('hello')
File "d:/python/test_project/test.py", line 10, in test_func
raise
RuntimeError: No active exception to reraise

5.可變參數

        如果有一個函數可能會傳入多個參數,但是又不確定參數的個數是多少,此時就可以使用可變參數。可變參數允許傳入的參數個數為0個

def test_func(*data):
for n in data:
print(n)
test_func('hello','world',"this","is")
結果:
hello
world
this
is

如果此時有一個list或tuple需要傳入函數中,也可以使用可變參數來實現。

def test_func(*data):
for n in data:
print(n)
temp = ['this','is','a','test']
test_func(*temp)
結果:
this
is
a
test

6.關鍵字參數

        關鍵字參數允許傳入0個任意個含參數名的參數,這些關鍵字參數在函數內部自動組裝成一個dict

def personal_inf(**inf):
print(inf)
personal_inf(name = 'json', age=18)
結果:
{'name': 'json', 'age': 18}

7.命名關鍵字參數

        對於關鍵字參數,函數調用者可以傳入任意個數的關鍵字參數,對於需要的參數,可以在函數中自行判斷。例如

def personal_inf(**inf):
if 'name' in inf:
print('name is %s' %inf['name'])
if 'age' in inf:
print('age is %s' %inf['age'])
personal_inf(age=18,city='beijing')
結果:
age is 18

        如果需要對參數的關鍵字進行限制的話,就需要用到命名關鍵字參數。命名關鍵字參數需要一個特殊分割符 ‘ * ’ ,' * ' 後面的參數被視為命名關鍵字參數

def personal_inf(*,name,age):
print(name,age)
personal_inf(name='json',age=18)
結果:
json 18

        如果此時輸入的參數不是需要的參數的話。

def personal_inf(*,name,age):
print(name,age)
personal_inf(name='json',age=18,city='beijing')

        編譯就會報錯

Traceback (most recent call last):
File "d:/python/test_project/test.py", line 18, in <module>
personal_inf(name='json',age=18,city='beijing')
TypeError: personal_inf() got an unexpected keyword argument 'city'

8.map

        map()函數接收兩個參數,一個是函數,一個是Iterator,Iterator是惰性序列,因此通過List()函數讓他把整個序列都計算出來並返回一個list

def t_lower(a):
return a.lower()
tl = {'HELLO','WORLD',"THIS","IS"}
tl2 = list(map(t_lower,['HELLO','WORLD',"THIS","IS"])) #將所有元素通過t_lower函數轉為小寫,並最終通過list()函數轉換為list
print(tl2)
結果:
['hello', 'world', 'this', 'is']

9.reduce

        reduce()函數接收兩個參數,一個是函數,一個是序列。reduce把結果繼續和下一個元素做累積計算

def t_sum(a, b):
return a+b
tl = {1,2,3,4,5,6,7,8,9,10}
print(reduce(t_sum,tl)) #計算累加和
結果:
55

10.filter

        filter是一個內建的函數,用於過濾序列。接收兩個參數,一個函數,一個序列filter()把傳入的函數一次作用於每個元素,然後根據返回值是True還是False決定保留還是丟棄該元素。注意,filter()函數返回的是一個Iterator惰性序列,所以要用list函數獲取所有結果並返回list

        strip方法

        strip方法用於移除字符串頭、尾指定的字符(默認是空格或換行符)或字符序列。

        注意:該方法只能刪除開頭或結尾的字符不能刪除中間部分的字符

tl2 = "000012345678900000"
print(tl2.strip('0')) #過濾頭和尾的0
結果:
123456789

        strip能過濾字符串,當然也能過濾List中的元素字符串,比如可以過濾List中的空元素

def filter_empty(a):
return a and a.strip() #默認過濾空
tl = ['',None,'a','b','','c',None,'d']
print(list(filter(filter_empty,tl)))
結果:
['a', 'b', 'c', 'd']

11.sorted

        sorted是一個自動排序的函數,該函數是一個高階函數,可以接受一個Key函數來實現自定義的排序

tl = [10,8,6,4,2,1,3,5,7,9] #排序
print(sorted(tl))
結果:
[1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
def t_square(a):
return a*a
tl = [-10,8,-6,4,-2,1,-3,5,-7,9]
print(sorted(tl,key=t_square)) #對比元素的平方後進行排序
結果:
[1, -2, -3, 4, 5, -6, -7, 8, 9, -10]

12.hasattr

        該函數用於判斷某個對象中,是否存在指定的屬性名存在返回True否則,返回False

        第一個參數:對象

        第二個參數:屬性名

class human:
def __init__(self) -> None:#初始化
self.name = 'xiaoming'
self.age = 18
self.city = 'shanghai'
print(hasattr(p,'name'))
print(hasattr(p,'age'))
print(hasattr(p,'gender'))
結果:
True
True
False

13.getattr

        返回對象對應的屬性(第二個參數指定的屬性),當只有兩個參數時,若不存在,則報錯三個參數時,若不存在,則返回第三個參數設置的默認值

        第一個參數:對象

        第二個參數:屬性

        第三個參數:報錯值

class human:
def __init__(self) -> None:#初始化
self.name = 'xiaoming'
self.age = 18
self.city = 'shanghai'
print(getattr(p,'name'))
print(getattr(p,'gender'))
print(getattr(p,'gender',-2))
結果:
xiaoming
Traceback (most recent call last): #只有兩個參數,報錯
File "d:/python/test_project/test.py", line 78, in <module>
print(getattr(p,'gender')) #實例
AttributeError: 'human' object has no attribute 'gender'
-2 #有三個參數,返回第三個參數的值

14.setattr

        設置對象的指定屬性內容。如果當前設置的屬性不存在,則創建該屬性。

        第一個參數:對象

        第二個參數:屬性名

        第三個參數:屬性值

class human:
def __init__(self) -> None:#初始化
self.name = 'xiaoming'
self.age = 18
self.city = 'shanghai'
print(getattr(p,'name'))
setattr(p,'name','lisa') #修改屬性值
print(getattr(p,'name'))
print(getattr(p,'gender',-1)) #獲取不存在的屬性
setattr(p,'gender','boy') #該屬性不存在,則創建屬性
print(p.gender)
結果:
xiaoming
lisa
-1
boy

15.delattr

        刪除屬性,如果沒有該屬性,則直接報錯

class human:
def __init__(self) -> None:#初始化
self.name = 'xiaoming'
self.age = 18
self.city = 'shanghai'
print(getattr(p,'name'))
delattr(p,'name') #刪除屬性
print(getattr(p,'name',-1))
結果:
xiaoming
-1

16.動態操作屬性

        可以通過用戶輸入的方式來實現動態添加屬性。

class human:
def __init__(self) -> None:#初始化
self.name = 'xiaoming'
self.age = 18
self.city = 'shanghai'
p = human() #實例
attr = input('請輸入要添加的屬性名:')
attr_value = input('請輸入要添加的屬性值:')
setattr(p,attr,attr_value) #添加屬性
print('您添加的屬性名為:%s,屬性值為:%s' %(attr,getattr(p,attr,-1)))
結果:
請輸入要添加的屬性名:height
請輸入要添加的屬性值:180
您添加的屬性名為:height,屬性值為:180


  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式師世界 All Rights Reserved