ทางลัดเชิงวัตถุ

บทนี้จะพูดถึงรายละเอียดเกี่ยวกับฟังก์ชันในตัวต่างๆใน Python การดำเนินการไฟล์ I / O และแนวคิดการโอเวอร์โหลด

ฟังก์ชันในตัว Python

ล่าม Python มีฟังก์ชันหลายอย่างที่เรียกว่าฟังก์ชันในตัวซึ่งพร้อมใช้งานสำหรับการใช้งาน ในเวอร์ชันล่าสุด Python มีฟังก์ชันในตัว 68 ฟังก์ชันดังแสดงในตารางด้านล่าง -

ฟังก์ชั่นในตัว
เอบีเอส () คำสั่ง () ช่วยด้วย() นาที() setattr ()
ทั้งหมด() ผบ. () ฐานสิบหก () ต่อไป() ชิ้น ()
ใด ๆ () Divmod () id () วัตถุ() จัดเรียง ()
ascii () แจกแจง () อินพุต () ต.ค. () วิธีการคงที่ ()
ถังขยะ () ประเมิน () int () เปิด() str ()
บูล () ผู้บริหาร () isinstance () อ๊อด () ผลรวม ()
บายเทียร์เรย์ () กรอง() issubclass () ธาร () ซุปเปอร์ ()
ไบต์ () ลอย() iter () พิมพ์() ทูเพิล ()
โทรได้ () รูปแบบ() เลน () คุณสมบัติ () ประเภท ()
chr () โฟโมเซท () รายการ() พิสัย() vars ()
วิธีการเรียน () getattr () ชาวบ้าน () ตัวแทน () ซิป ()
รวบรวม() ลูกโลก () แผนที่() ย้อนกลับ () __ นำเข้า __ ()
ซับซ้อน () hasattr () สูงสุด () รอบ()
เดลต้า () กัญชา() memoryview () ชุด ()

ส่วนนี้จะกล่าวถึงหน้าที่สำคัญบางประการโดยสังเขป -

len () ฟังก์ชัน

ฟังก์ชัน len () รับความยาวของสตริงรายการหรือคอลเลกชัน ส่งคืนความยาวหรือจำนวนรายการของวัตถุโดยที่วัตถุสามารถเป็นสตริงรายการหรือคอลเล็กชัน

>>> len(['hello', 9 , 45.0, 24])
4

len () ฟังก์ชันภายในทำงานเช่น list.__len__() หรือ tuple.__len__(). ดังนั้นโปรดทราบว่า len () ใช้งานได้เฉพาะกับวัตถุที่มี __len__() วิธี.

>>> set1
{1, 2, 3, 4}
>>> set1.__len__()
4

อย่างไรก็ตามในทางปฏิบัติเราชอบ len() แทนที่จะเป็น __len__() ฟังก์ชั่นเนื่องจากเหตุผลดังต่อไปนี้ -

  • มีประสิทธิภาพมากขึ้น และไม่จำเป็นที่วิธีการใดวิธีหนึ่งจะถูกเขียนขึ้นเพื่อปฏิเสธการเข้าถึงวิธีพิเศษเช่น __len__

  • ง่ายต่อการบำรุงรักษา

  • รองรับความเข้ากันได้ย้อนหลัง

ย้อนกลับ (seq)

มันส่งคืนตัวทำซ้ำย้อนกลับ seq ต้องเป็นอ็อบเจ็กต์ที่มีเมธอด __ ย้อนกลับ __ () หรือสนับสนุนโปรโตคอลลำดับ (เมธอด __len __ () และเมธอด __getitem __ ()) โดยทั่วไปจะใช้ในfor วนซ้ำเมื่อเราต้องการวนซ้ำรายการจากด้านหลังไปด้านหน้า

>>> normal_list = [2, 4, 5, 7, 9]
>>>
>>> class CustomSequence():
   def __len__(self):
      return 5
   def __getitem__(self,index):
      return "x{0}".format(index)
>>> class funkyback():
   def __reversed__(self):
      return 'backwards!'
>>> for seq in normal_list, CustomSequence(), funkyback():
      print('\n{}: '.format(seq.__class__.__name__), end="")
      for item in reversed(seq):
         print(item, end=", ")

for loop ในตอนท้ายจะพิมพ์รายการที่กลับรายการปกติและอินสแตนซ์ของลำดับที่กำหนดเองสองลำดับ ผลลัพธ์แสดงให้เห็นว่าreversed() ทำงานกับทั้งสามอย่าง แต่มีผลลัพธ์ที่แตกต่างกันมากเมื่อเรากำหนด __reversed__.

เอาต์พุต

คุณสามารถสังเกตผลลัพธ์ต่อไปนี้เมื่อคุณรันโค้ดที่ระบุด้านบน -

list: 9, 7, 5, 4, 2,
CustomSequence: x4, x3, x2, x1, x0,
funkyback: b, a, c, k, w, a, r, d, s, !,

แจกแจง

enumerate () วิธีการเพิ่มตัวนับเพื่อทำซ้ำได้และส่งคืนอ็อบเจ็กต์แจงนับ

ไวยากรณ์ของ enumerate () คือ -

enumerate(iterable, start = 0)

นี่คืออาร์กิวเมนต์ที่สอง start เป็นทางเลือกและโดยค่าเริ่มต้นดัชนีเริ่มต้นด้วยศูนย์ (0)

>>> # Enumerate
>>> names = ['Rajesh', 'Rahul', 'Aarav', 'Sahil', 'Trevor']
>>> enumerate(names)
<enumerate object at 0x031D9F80>
>>> list(enumerate(names))
[(0, 'Rajesh'), (1, 'Rahul'), (2, 'Aarav'), (3, 'Sahil'), (4, 'Trevor')]
>>>

ดังนั้น enumerate()ส่งคืนตัววนซ้ำซึ่งให้ทูเปิลที่เก็บจำนวนองค์ประกอบในลำดับที่ส่งผ่าน เนื่องจากค่าที่ส่งคืนเป็นตัววนซ้ำการเข้าถึงโดยตรงจึงไม่มีประโยชน์มากนัก แนวทางที่ดีกว่าสำหรับ enumerate () คือการนับภายในสำหรับลูป

>>> for i, n in enumerate(names):
   print('Names number: ' + str(i))
   print(n)
Names number: 0
Rajesh
Names number: 1
Rahul
Names number: 2
Aarav
Names number: 3
Sahil
Names number: 4
Trevor

มีฟังก์ชั่นอื่น ๆ อีกมากมายในไลบรารีมาตรฐานและนี่คือรายการฟังก์ชันอื่น ๆ ที่ใช้กันอย่างแพร่หลาย -

  • hasattr, getattr, setattr และ delattr, ซึ่งอนุญาตให้แอททริบิวต์ของอ็อบเจ็กต์ถูกจัดการโดยชื่อสตริง

  • all และ any, ซึ่งยอมรับวัตถุที่ทำซ้ำได้และส่งคืน True ถ้ารายการทั้งหมดหรือใด ๆ ประเมินว่าเป็นจริง

  • nzip, ซึ่งใช้เวลาสองลำดับขึ้นไปและส่งกลับลำดับใหม่ของทูเปิลโดยที่ทูเพิลแต่ละตัวมีค่าเดียวจากแต่ละลำดับ

ไฟล์ I / O

แนวคิดของไฟล์เกี่ยวข้องกับคำว่าการเขียนโปรแกรมเชิงวัตถุ Python ได้รวมอินเทอร์เฟซที่ระบบปฏิบัติการมีให้ในรูปแบบนามธรรมที่ช่วยให้เราสามารถทำงานกับไฟล์อ็อบเจ็กต์

open()ฟังก์ชันในตัวใช้เพื่อเปิดไฟล์และส่งคืนอ็อบเจ็กต์ไฟล์ เป็นฟังก์ชันที่ใช้บ่อยที่สุดโดยมีสองอาร์กิวเมนต์ -

open(filename, mode)

ฟังก์ชัน open () เรียกสองอาร์กิวเมนต์อันดับแรกคือชื่อไฟล์และที่สองคือโหมด โหมดที่นี่สามารถเป็น 'r' สำหรับโหมดอ่านอย่างเดียว 'w' สำหรับการเขียนเท่านั้น (ไฟล์ที่มีอยู่ซึ่งมีชื่อเดียวกันจะถูกลบ) และ 'a' เปิดไฟล์เพื่อต่อท้ายข้อมูลใด ๆ ที่เขียนลงในไฟล์จะถูกเพิ่มโดยอัตโนมัติ ไปยังจุดสิ้นสุด 'r +' เปิดไฟล์สำหรับทั้งการอ่านและการเขียน โหมดเริ่มต้นคืออ่านอย่างเดียว

ใน Windows 'b' ที่ต่อท้ายโหมดจะเปิดไฟล์ในโหมดไบนารีดังนั้นจึงมีโหมดเช่น 'rb', 'wb' และ 'r + b' ด้วย

>>> text = 'This is the first line'
>>> file = open('datawork','w')
>>> file.write(text)
22
>>> file.close()

ในบางกรณีเราแค่ต้องการต่อท้ายไฟล์ที่มีอยู่แทนที่จะเขียนทับเพื่อที่เราจะให้ค่า 'a' เป็นอาร์กิวเมนต์โหมดเพื่อต่อท้ายไฟล์แทนที่จะเขียนทับไฟล์ที่มีอยู่ทั้งหมด เนื้อหา

>>> f = open('datawork','a')
>>> text1 = ' This is second line'
>>> f.write(text1)
20
>>> f.close()

เมื่อเปิดไฟล์เพื่ออ่านเราสามารถเรียกใช้เมธอด read, readline หรือ readlines เพื่อรับเนื้อหาของไฟล์ วิธีการอ่านจะส่งคืนเนื้อหาทั้งหมดของไฟล์เป็นวัตถุ str หรือ bytes ขึ้นอยู่กับว่าอาร์กิวเมนต์ที่สองคือ 'b'

เพื่อความสะดวกในการอ่านและเพื่อหลีกเลี่ยงการอ่านไฟล์ขนาดใหญ่ในครั้งเดียวควรใช้ for loop กับไฟล์อ็อบเจ็กต์โดยตรง สำหรับไฟล์ข้อความมันจะอ่านทีละบรรทัดทีละบรรทัดและเราสามารถประมวลผลภายในเนื้อหาของลูปได้ สำหรับไฟล์ไบนารีอย่างไรก็ตามควรอ่านข้อมูลที่มีขนาดคงที่โดยใช้วิธีการอ่าน () โดยส่งผ่านพารามิเตอร์สำหรับจำนวนไบต์สูงสุดที่จะอ่าน

>>> f = open('fileone','r+')
>>> f.readline()
'This is the first line. \n'
>>> f.readline()
'This is the second line. \n'

การเขียนไฟล์โดยใช้วิธีการเขียนบนอ็อบเจ็กต์ไฟล์จะเขียนอ็อบเจ็กต์สตริง (ไบต์สำหรับข้อมูลไบนารี) ลงในไฟล์ เมธอดไรท์ไลน์ยอมรับลำดับของสตริงและเขียนค่าซ้ำแต่ละค่าลงในไฟล์ วิธีการเขียนไม่ต่อท้ายบรรทัดใหม่หลังจากแต่ละรายการในลำดับ

ในที่สุดควรเรียกเมธอด close () เมื่อเราอ่านหรือเขียนไฟล์เสร็จแล้วเพื่อให้แน่ใจว่ามีการเขียนบัฟเฟอร์ใด ๆ ลงในดิสก์ไฟล์นั้นได้รับการล้างข้อมูลอย่างเหมาะสมและทรัพยากรทั้งหมดที่เชื่อมโยงกับไฟล์จะถูกปล่อยกลับไปที่ ระบบปฏิบัติการ เป็นวิธีที่ดีกว่าในการเรียกเมธอด close () แต่ในทางเทคนิคแล้วสิ่งนี้จะเกิดขึ้นโดยอัตโนมัติเมื่อมีสคริปต์

อีกทางเลือกหนึ่งสำหรับวิธีการโอเวอร์โหลด

การโอเวอร์โหลดเมธอดหมายถึงการมีหลายเมธอดที่มีชื่อเดียวกันซึ่งยอมรับอาร์กิวเมนต์ที่แตกต่างกัน

ด้วยวิธีการหรือฟังก์ชันเดียวเราสามารถระบุจำนวนพารามิเตอร์ของเราเองได้ ขึ้นอยู่กับนิยามฟังก์ชันสามารถเรียกใช้ด้วยพารามิเตอร์ศูนย์หนึ่งสองหรือมากกว่า

class Human:
   def sayHello(self, name = None):
      if name is not None:
         print('Hello ' + name)
      else:
         print('Hello ')

#Create Instance
obj = Human()

#Call the method, else part will be executed
obj.sayHello()

#Call the method with a parameter, if part will be executed
obj.sayHello('Rahul')

เอาต์พุต

Hello
Hello Rahul

อาร์กิวเมนต์เริ่มต้น

ฟังก์ชั่นเป็นวัตถุด้วย

อ็อบเจกต์ที่เรียกได้คืออ็อบเจ็กต์ที่สามารถยอมรับอาร์กิวเมนต์บางอย่างและอาจส่งคืนอ็อบเจ็กต์ ฟังก์ชันเป็นอ็อบเจ็กต์ที่เรียกได้ง่ายที่สุดใน Python แต่ก็มีคลาสอื่น ๆ เช่นคลาสหรืออินสแตนซ์คลาสบางตัวเช่นกัน

ทุกฟังก์ชันใน Python คืออ็อบเจกต์ ออบเจ็กต์สามารถมีเมธอดหรือฟังก์ชันได้ แต่อ็อบเจ็กต์ไม่จำเป็นต้องมีฟังก์ชัน

def my_func():
   print('My function was called')
my_func.description = 'A silly function'
def second_func():

   print('Second function was called')

   second_func.description = 'One more sillier function'

def another_func(func):
   print("The description:", end=" ")
   print(func.description)
   print('The name: ', end=' ')
   print(func.__name__)
   print('The class:', end=' ')
   print(func.__class__)
   print("Now I'll call the function passed in")
   func()

another_func(my_func)
another_func(second_func)

ในโค้ดด้านบนเราสามารถส่งสองฟังก์ชันที่แตกต่างกันเป็นอาร์กิวเมนต์ไปยังฟังก์ชันที่สามของเราและได้รับผลลัพธ์ที่แตกต่างกันสำหรับแต่ละฟังก์ชัน -

The description: A silly function
The name: my_func
The class: 
      
        Now I'll call the function passed in My function was called The description: One more sillier function The name: second_func The class: 
       
         Now I'll call the function passed in Second function was called 
       
      

callable objects

Just as functions are objects that can have attributes set on them, it is possible to create an object that can be called as though it were a function.

In Python any object with a __call__() method can be called using function-call syntax.