Hong  Nhung

Hong Nhung

1660374017

Hướng Dẫn Về Các Phương Pháp Kỳ Diệu Của Python

Một trong những yếu tố góp phần làm cho Python trở thành một ngôn ngữ lập trình mạnh mẽ như vậy là các phương thức ma thuật. Trong một số vòng tròn Pythonista, bạn có thể nghe thấy chúng được gọi là 'phương pháp mờ hơn' do cấu trúc gạch dưới kép của chúng. 

Vai trò của chúng trong Python là thực hiện một thủ tục được gọi là 'nạp chồng toán tử', điều này đơn giản có nghĩa là toán tử được xác định trước được cung cấp với ý nghĩa mở rộng. Nói cách khác, nạp chồng toán tử được sử dụng để thêm các hành vi tùy chỉnh vào các lớp của chúng tôi để cho phép sử dụng chúng với các toán tử và chức năng tích hợp của Python.  

Trong bài viết này, chúng ta sẽ đi sâu hơn vào các phương thức phép thuật trong Python bằng cách: 

  • Phân biệt sự khác biệt giữa phương thức và chức năng
  • Giải thích các phương pháp ma thuật là gì
  • Cung cấp một số ví dụ Python.

Các phương thức Python so với các hàm

Trước khi chúng ta có thể tìm hiểu các phương thức ma thuật là gì, chúng ta phải hiểu sự khác biệt giữa một phương thức và một hàm trong Python. 

Python sử dụng các phương thức để biểu diễn hành vi của một đối tượng. Do đó, các phương thức được liên kết với một đối tượng và sẽ thực hiện một số hoạt động trên dữ liệu bên trong một đối tượng. Một yếu tố phân biệt quan trọng khác của một phương thức là tham số self phải luôn luôn xuất hiện dưới dạng tham số đầu tiên được truyền cho phương thức. 

Lưu ý : Nó không nhất thiết phải là từ self làm tham số đầu tiên, nhưng Pythonistas đã đồng ý rằng đó là một phương pháp hay nhất. 

# Example of a method
class Human:
    # This is a method
    def walk(self):
        print("I am walking") 

Các phương thức phụ thuộc vào lớp mà chúng được liên kết. Do đó, để gọi một phương thức, một thể hiện của lớp phải được tạo trước khi phương thức đó có thể được truy cập bằng toán tử dot. 

# This will work
joe = Human()
joe.walk()

"""
I am walking
"""




# This will throw a NameError
walk()

---------------------------------------------------------------------------
NameError                                 Traceback (most recent call last)
/tmp/ipykernel_153/2327344440.py in <module>
      4
      5 # This will throw a NameError
----> 6 walk()

NameError: name 'walk' is not defined

Mặt khác, một hàm thì khác: chúng ta không phải tạo một thể hiện của một lớp. 

Các hàm Python là các bước được thực thi như một khối mã chỉ khi được gọi. Chúng được định nghĩa độc lập với bất kỳ đối tượng lớp nào, có nghĩa là chúng có thể được gọi trực tiếp bằng tên của chúng. Vì chúng không được liên kết với bất kỳ lớp nào, chúng ta không phải chuyển self làm tham số - các tham số là tùy chọn. 

Về bản chất, một hàm chỉ đơn giản là một tập hợp các lệnh được xác định rõ ràng mà trình thông dịch sử dụng để thực hiện một tác vụ. 

# Example of a function
def run():
  print("I am running.")
​
run()

"""
I am running.
"""

Như đã tìm hiểu trong bài viết Cách gọi và viết hàm của chúng tôi , các hàm cũng có hai loại khác nhau: cài sẵn và do người dùng định nghĩa. 

  • Các hàm dựng sẵn: Các hàm có trong thư viện chuẩn Python.
  • Các hàm do người dùng định nghĩa: Các hàm do người dùng xác định - Python cho phép người dùng xác định và sử dụng các hàm của riêng họ có thể được truy cập trong một chương trình Python.

Theo nhiều khía cạnh, các phương thức và hàm giống hệt nhau - tức là chúng đều được định nghĩa bằng một câu lệnh def. Sự khác biệt cơ bản là các phương thức được liên kết với một đối tượng và được sử dụng để hoạt động trên dữ liệu được chứa trong một lớp, trong khi các hàm được định nghĩa độc lập và có thể được gọi bằng tên của chúng ở bất kỳ đâu trong chương trình. 

Các phương pháp phép thuật trong Python là gì?

Ở phần đầu của hướng dẫn, chúng tôi đã đề cập rằng các phương thức ma thuật còn được gọi là phương thức dunder do cấu trúc dấu gạch dưới kép của chúng. Ý của chúng tôi là tất cả các phương thức ma thuật Python đều bắt đầu và kết thúc bằng hai dấu gạch dưới. 

 

Phương thức ma thuật được công nhận nhiều nhất là phương thức __init__, cho phép khởi tạo một lớp với các thuộc tính cụ thể. 

class Employee:
    def __init__(self, name, age, role):
        self.name = name
        self.age = age
        self.role = role

Để khởi tạo một cá thể của lớp này, chúng ta phải chỉ định các thuộc tính tên, tuổi và vai trò của cá thể đó. Ví dụ:

user_1 = Employee(name="John", age=24, role="Data Scientist")

Nếu không làm như vậy sẽ gây ra lỗi TypeError

 

Phương thức __init__ thuộc danh mục phương thức ma thuật khởi tạo và xây dựng, nhưng nó chỉ là một trong nhiều phương thức. Bảng dưới đây trình bày chi tiết một số phương pháp khởi tạo và xây dựng ma thuật khác. 

 

__new __ (cls, other)Được sử dụng để tạo một phiên bản mới của một lớp
__init __ (bản thân, khác)Được gọi sau khi một phiên bản mới đã được tạo; Tất cả các thuộc tính được truyền cho biểu thức phương thức khởi tạo lớp sẽ được sử dụng làm thuộc tính. 
__del __ (bản thân)Còn được gọi là bộ hủy; Được gọi khi một thể hiện sẽ bị phá hủy. 

Cách đơn giản nhất để khái niệm các phương thức ma thuật có thể là liên hệ giữa việc triển khai của bạn và trình thông dịch python. Một trong những điều khoản trong hợp đồng yêu cầu Python thực hiện một số hành động trong một số trường hợp cụ thể, chẳng hạn như khởi tạo một cá thể lớp với các đối tượng cụ thể. 

 

Nói cách khác, bạn không có trách nhiệm gọi một phương thức ma thuật trực tiếp bằng cách gọi nó - Python làm điều đó cho bạn đằng sau hậu trường. 

Phương pháp biểu diễn chuỗi

Python là một ngôn ngữ lập trình hướng đối tượng (OOP) - mọi thứ trong Python đều là một đối tượng. Khi một đối tượng mới được tạo, chúng ta mặc nhiên tạo một đối tượng có liên quan vì tất cả các lớp đều kế thừa từ đối tượng.  

 

Lưu ý: bạn cũng có thể làm cho kế thừa rõ ràng bằng cách chuyển đối tượng lớp vào lớp của bạn. 

# This works
class Car:
  pass
​
# This also works
class Vehicle(object):
  pass
​
car = Car()
vehicle = Vehicle()
​
print(car, vehicle, sep="\n")

"""
<__main__.Car object at 0x7f80449dc0a0>
<__main__.Vehicle object at 0x7f80449dc1f0>
"""

Trong đoạn mã trên, chúng ta đã tạo hai lớp trống, nhưng trình thông dịch Python vẫn biết những gì cần in khi chúng ta gọi câu lệnh in. Điều này có thể thực hiện được vì tất cả các lớp kế thừa từ lớp đối tượng (lớp cha của tất cả các lớp trong Python) và nó có một phương thức ma thuật được gọi là __repr__, trong đó câu lệnh print sẽ trả về một giá trị trở lại chương trình chính của chúng ta.  

 

Những người quen thuộc với kế thừa sẽ biết rằng một lớp con có thể ghi đè lên lớp cha của nó bằng cách định nghĩa phương thức riêng của nó có cùng tên. 

# Overriding the object __repr__
class Vehicle:
  def __repr__(self):
      return f"{self.__class__.__qualname__}"
​
vehicle = Vehicle()
print(vehicle)

"""
Vehicle
"""

Bạn cũng có thể sử dụng phương thức ma thuật __str__ để tạo biểu diễn chuỗi được gọi với câu lệnh in. 

 

Trên thực tế, phương thức ma thuật __repr__ đóng vai trò là hành vi sao lưu vào phương thức ma thuật __str__. Do đó, khi chúng ta gọi câu lệnh print, trước tiên Python sẽ tìm phương thức __str__ được định nghĩa trong lớp của bạn trước khi quay lại phương thức __repr__. 

# Using __str__ for string representation
class Vehicle:
  def __str__(self):
      return f"{self.__class__.__qualname__}"
     
vehicle = Vehicle()
print(vehicle)

"""
Vehicle
"""

Bảng dưới đây bao gồm danh sách các phương thức ma thuật biểu diễn chuỗi khác. 

 

__str __ (bản thân)Được gọi bằng hàm str () tích hợp của Python và bằng câu lệnh print để hiển thị biểu diễn chuỗi không chính thức của một đối tượng. Lưu ý rằng nó không bắt buộc phải là một biểu thức Python hợp lệ. 
__repr __ (bản thân)Được gọi bằng hàm repr () tích hợp của Python và các chuyển đổi chuỗi để hiển thị biểu diễn chuỗi chính thức của một đối tượng. Lưu ý rằng điều này sẽ trông giống như một biểu thức Python hợp lệ, nhưng một chuỗi có mô tả hữu ích sẽ được ưu tiên nếu điều này không thể thực hiện được. 
__unicode __ (bản thân)Được gọi để triển khai hàm unicode () có sẵn của Python và trả về một đối tượng Unicode. 
__hash __ (bản thân)Được gọi bằng hàm băm () tích hợp của Python và các hoạt động trên các thành viên của bộ sưu tập được băm. Phương thức sẽ trả về một số nguyên. 
__nonzero __ (tự)Được gọi bằng hoạt động bool () tích hợp của Python để triển khai kiểm tra giá trị sự thật. Phương thức phải trả về True hoặc False (hoặc số nguyên tương đương 1 hoặc 0 của chúng). 

 

Các phương pháp "ma thuật" đóng gói 

Đóng gói là một trong những khái niệm cơ bản trong lập trình hướng đối tượng (OOP). Nó đề cập đến việc đóng gói dữ liệu với các phương thức hoạt động trên dữ liệu đó hoặc hạn chế quyền truy cập trực tiếp vào các thành phần nhất định trong một đối tượng.

 

Các nhà phát triển đến từ các ngôn ngữ OOP khác thường xuyên tranh cãi về sự thất bại của Python trong việc nắm bắt tính năng đóng gói cho các lớp thực sự. Những người này quen với việc có các công cụ sửa đổi rõ ràng cho các phương thức hoặc trường cho phép họ xác định những thứ, chẳng hạn như thuộc tính private với getters và setters công khai. Sự khác biệt trong Python là phần lớn sự đóng gói hiện có xảy ra thông qua các phương thức ma thuật. 

 

Ví dụ: __setattr__ là một giải pháp đóng gói cho phép chúng tôi xác định hành vi để gán cho một thuộc tính bất chấp sự hiện diện của nó. Nói cách khác, các quy tắc có thể được xác định cho những thay đổi trong giá trị của các thuộc tính. 

import string

class Alphabet():
    def __setattr__(self, name, value):
        self.__dict__[name] = value.upper()

a = Alphabet()

# Assinging an attribute that does not exist
# The setattr should convert it to caps despite being set as lowercase
a.alphabet = string.ascii_lowercase
print(a.alphabet)

Trong đoạn mã trên, chúng tôi đã tạo một lớp có tên là Alphabet không có thuộc tính nào, nhưng chúng tôi đã nói với Python rằng chúng tôi muốn viết hoa bất kỳ thuộc tính nào của cá thể lớp mà chúng tôi đặt.

 

Chúng tôi hiểu rằng OOP có thể hơi xa tầm với đối với một số độc giả. Để bắt đầu với OOP bằng Python, hãy xem Theo dõi lập trình viên Python của DataCamp .   

Phương pháp toán học ma thuật

Một danh mục khác của các phương pháp phép thuật trong Python là các phương pháp phép thuật toán học (còn được gọi là các toán tử số học bình thường). Các biểu thức được tạo bằng cách sử dụng các ký hiệu đặc biệt mà chúng tôi gọi là 'toán tử' trong Python. Sử dụng các toán tử như vậy trong một biểu thức liên quan đến việc tạo ra các đối tượng bằng các phương pháp toán học. Việc không tuân thủ quy tắc này sẽ gây ra lỗi TypeError. 

class Numbers:
  def __init__(self, a, b):
      self.a = a
      self.b = b
   
set_a = Numbers(2, 4)
set_b = Numbers(3, 5)
​
print(set_a + set_b)
"""
---------------------------------------------------------------------------
TypeError                                 Traceback (most recent call last)
/tmp/ipykernel_152/3639634723.py in <module>
      7 set_b = Numbers(3, 5)
      8
----> 9 print(set_a + set_b)

TypeError: unsupported operand type(s) for +: 'Numbers' and 'Numbers'
"""

Trong đoạn mã trên, chúng tôi đã cố gắng tạo nhiều phiên bản của Số lớp và thêm chúng lại với nhau, điều này đã gây ra lỗi như mong đợi. Một giải pháp cho lỗi này có thể là tạo một phương thức trong lớp của chúng tôi để cộng các số lại với nhau, nhưng điều này sẽ ngăn chúng tôi tạo biểu thức. 

 

Giải pháp tốt hơn sẽ là triển khai phương thức ma thuật __add__ như sau:  

# Using add operator
class Numbers:
    def __init__(self, a, b):
        self.a = a
        self.b = b
   
    def __add__(self, other):
        # Only permit Numbers objects to be added
        if not isinstance(other, Numbers):
            return NotImplemented
        return Numbers(other.a + self.a, other.b + self.b)
   
    def __repr__(self):
      return f"{self.__class__.__qualname__}({self.a}, {self.b})"
   
a = Numbers(2, 4)
b = Numbers(3, 5)
print(a + b) # Should result in Numbers(5, 9)


"""
RandomNumbers(5, 9)
"""

Ví dụ mã ở trên chỉ cho phép chúng ta thêm hai đối tượng Numbers với nhau. Hãy triển khai một phương pháp toán học kỳ diệu khác cho phép chúng ta nhân một đối tượng Numbers với một số nguyên. 

# Multiplying Numbers with an integer
class Numbers:
    def __init__(self, a, b):
        self.a = a
        self.b = b
   
    def __add__(self, other):
        # Only permit Numbers objects to be added
        if not isinstance(other, Numbers):
            return NotImplemented
        return Numbers(other.a + self.a, other.b + self.b)
   
    def __mul__(self, other):
      if not isinstance(other, int):
          return NotImplemented
         
      return Numbers(self.a * other, self.b * other)
   
    def __repr__(self):
      return f"{self.__class__.__qualname__}({self.a}, {self.b})"
   
a = Numbers(2, 4)
print(a * 5) # Should return 10, 20




"""
RandomNumbers(10, 20)
"""

Trong đoạn mã trên, chúng tôi đã thêm một phương thức ma thuật __mul__ để cho phép chúng tôi nhân các số của lớp tùy chỉnh của chúng tôi với một số nguyên. 

 

Lưu ý rằng đối tượng Numbers xuất hiện ở phía bên trái của toán tử * - điều này không phải ngẫu nhiên. Hãy đặt nó ở phía bên phải của toán hạng và quan sát điều gì sẽ xảy ra. 

- snip --

a = Numbers(2, 4)
print(3 * a)
---------------------------------------------------------------------------
TypeError                                 Traceback (most recent call last)
/tmp/ipykernel_152/2857655049.py in <module>
      1 a = Numbers(2, 4)
----> 2 print(3 * a)

TypeError: unsupported operand type(s) for *: 'int' and 'Numbers'

Python ném ra một TypeError. 

 

Phương thức ma thuật __mul__ mà chúng tôi đã triển khai chỉ tính đến khi đối tượng Numbers nằm ở phía bên trái của toán tử *. Để mở rộng chức năng này, chúng ta phải thêm phương thức phép thuật ngược lại, __rmul__. 

# Enabling reverse multiplication
class Numbers:
    def __init__(self, a, b):
        self.a = a
        self.b = b
   
    def __add__(self, other):
        # Only permit Numbers objects to be added
        if not isinstance(other, Numbers):
            return NotImplemented
        return Numbers(other.a + self.a, other.b + self.b)
   
    def __mul__(self, other):
      if not isinstance(other, int):
          return NotImplemented
      return Numbers(self.a * other, self.b * other)

    def __rmul__(self, other):
        return self.__mul__(other)
   
    def __repr__(self):
      return f"{self.__class__.__qualname__}({self.a}, {self.b})"
   
a = Numbers(2, 4)
print(5 * a) # Should return 10, 20

"""
Numbers(10, 20)
"""

Bây giờ chúng ta có thể tạo một biểu thức nhân mà không cần phải xem xét mặt nào của toán hạng mà đối tượng Numbers xuất hiện. 

Gói (lại

Nguyên tắc cơ bản để tận dụng các phương thức ma thuật Python vẫn giữ nguyên: tạo một lớp và ghi đè phương thức ma thuật lớp đối tượng. Có rất nhiều phương pháp ma thuật trong Python, có nghĩa là nó sẽ là một hướng dẫn cực kỳ dài nếu chúng tôi quyết định trình bày tất cả chúng một cách riêng lẻ. Chúng tôi thực sự khuyên bạn nên xem tài liệu Python để có ý tưởng về phạm vi đầy đủ của các phương pháp ma thuật Python mà bạn có thể sử dụng để nâng cao kỹ năng lập trình Python của mình .  

Liên kết: https://www.datacamp.com/tutorial/introductioning-python-magic-methods

#python

What is GEEK

Buddha Community

Hướng Dẫn Về Các Phương Pháp Kỳ Diệu Của Python
Ray  Patel

Ray Patel

1619510796

Lambda, Map, Filter functions in python

Welcome to my Blog, In this article, we will learn python lambda function, Map function, and filter function.

Lambda function in python: Lambda is a one line anonymous function and lambda takes any number of arguments but can only have one expression and python lambda syntax is

Syntax: x = lambda arguments : expression

Now i will show you some python lambda function examples:

#python #anonymous function python #filter function in python #lambda #lambda python 3 #map python #python filter #python filter lambda #python lambda #python lambda examples #python map

Shardul Bhatt

Shardul Bhatt

1626775355

Why use Python for Software Development

No programming language is pretty much as diverse as Python. It enables building cutting edge applications effortlessly. Developers are as yet investigating the full capability of end-to-end Python development services in various areas. 

By areas, we mean FinTech, HealthTech, InsureTech, Cybersecurity, and that's just the beginning. These are New Economy areas, and Python has the ability to serve every one of them. The vast majority of them require massive computational abilities. Python's code is dynamic and powerful - equipped for taking care of the heavy traffic and substantial algorithmic capacities. 

Programming advancement is multidimensional today. Endeavor programming requires an intelligent application with AI and ML capacities. Shopper based applications require information examination to convey a superior client experience. Netflix, Trello, and Amazon are genuine instances of such applications. Python assists with building them effortlessly. 

5 Reasons to Utilize Python for Programming Web Apps 

Python can do such numerous things that developers can't discover enough reasons to admire it. Python application development isn't restricted to web and enterprise applications. It is exceptionally adaptable and superb for a wide range of uses.

Robust frameworks 

Python is known for its tools and frameworks. There's a structure for everything. Django is helpful for building web applications, venture applications, logical applications, and mathematical processing. Flask is another web improvement framework with no conditions. 

Web2Py, CherryPy, and Falcon offer incredible capabilities to customize Python development services. A large portion of them are open-source frameworks that allow quick turn of events. 

Simple to read and compose 

Python has an improved sentence structure - one that is like the English language. New engineers for Python can undoubtedly understand where they stand in the development process. The simplicity of composing allows quick application building. 

The motivation behind building Python, as said by its maker Guido Van Rossum, was to empower even beginner engineers to comprehend the programming language. The simple coding likewise permits developers to roll out speedy improvements without getting confused by pointless subtleties. 

Utilized by the best 

Alright - Python isn't simply one more programming language. It should have something, which is the reason the business giants use it. Furthermore, that too for different purposes. Developers at Google use Python to assemble framework organization systems, parallel information pusher, code audit, testing and QA, and substantially more. Netflix utilizes Python web development services for its recommendation algorithm and media player. 

Massive community support 

Python has a steadily developing community that offers enormous help. From amateurs to specialists, there's everybody. There are a lot of instructional exercises, documentation, and guides accessible for Python web development solutions. 

Today, numerous universities start with Python, adding to the quantity of individuals in the community. Frequently, Python designers team up on various tasks and help each other with algorithmic, utilitarian, and application critical thinking. 

Progressive applications 

Python is the greatest supporter of data science, Machine Learning, and Artificial Intelligence at any enterprise software development company. Its utilization cases in cutting edge applications are the most compelling motivation for its prosperity. Python is the second most well known tool after R for data analytics.

The simplicity of getting sorted out, overseeing, and visualizing information through unique libraries makes it ideal for data based applications. TensorFlow for neural networks and OpenCV for computer vision are two of Python's most well known use cases for Machine learning applications.

Summary

Thinking about the advances in programming and innovation, Python is a YES for an assorted scope of utilizations. Game development, web application development services, GUI advancement, ML and AI improvement, Enterprise and customer applications - every one of them uses Python to its full potential. 

The disadvantages of Python web improvement arrangements are regularly disregarded by developers and organizations because of the advantages it gives. They focus on quality over speed and performance over blunders. That is the reason it's a good idea to utilize Python for building the applications of the future.

#python development services #python development company #python app development #python development #python in web development #python software development

Hong  Nhung

Hong Nhung

1660374017

Hướng Dẫn Về Các Phương Pháp Kỳ Diệu Của Python

Một trong những yếu tố góp phần làm cho Python trở thành một ngôn ngữ lập trình mạnh mẽ như vậy là các phương thức ma thuật. Trong một số vòng tròn Pythonista, bạn có thể nghe thấy chúng được gọi là 'phương pháp mờ hơn' do cấu trúc gạch dưới kép của chúng. 

Vai trò của chúng trong Python là thực hiện một thủ tục được gọi là 'nạp chồng toán tử', điều này đơn giản có nghĩa là toán tử được xác định trước được cung cấp với ý nghĩa mở rộng. Nói cách khác, nạp chồng toán tử được sử dụng để thêm các hành vi tùy chỉnh vào các lớp của chúng tôi để cho phép sử dụng chúng với các toán tử và chức năng tích hợp của Python.  

Trong bài viết này, chúng ta sẽ đi sâu hơn vào các phương thức phép thuật trong Python bằng cách: 

  • Phân biệt sự khác biệt giữa phương thức và chức năng
  • Giải thích các phương pháp ma thuật là gì
  • Cung cấp một số ví dụ Python.

Các phương thức Python so với các hàm

Trước khi chúng ta có thể tìm hiểu các phương thức ma thuật là gì, chúng ta phải hiểu sự khác biệt giữa một phương thức và một hàm trong Python. 

Python sử dụng các phương thức để biểu diễn hành vi của một đối tượng. Do đó, các phương thức được liên kết với một đối tượng và sẽ thực hiện một số hoạt động trên dữ liệu bên trong một đối tượng. Một yếu tố phân biệt quan trọng khác của một phương thức là tham số self phải luôn luôn xuất hiện dưới dạng tham số đầu tiên được truyền cho phương thức. 

Lưu ý : Nó không nhất thiết phải là từ self làm tham số đầu tiên, nhưng Pythonistas đã đồng ý rằng đó là một phương pháp hay nhất. 

# Example of a method
class Human:
    # This is a method
    def walk(self):
        print("I am walking") 

Các phương thức phụ thuộc vào lớp mà chúng được liên kết. Do đó, để gọi một phương thức, một thể hiện của lớp phải được tạo trước khi phương thức đó có thể được truy cập bằng toán tử dot. 

# This will work
joe = Human()
joe.walk()

"""
I am walking
"""




# This will throw a NameError
walk()

---------------------------------------------------------------------------
NameError                                 Traceback (most recent call last)
/tmp/ipykernel_153/2327344440.py in <module>
      4
      5 # This will throw a NameError
----> 6 walk()

NameError: name 'walk' is not defined

Mặt khác, một hàm thì khác: chúng ta không phải tạo một thể hiện của một lớp. 

Các hàm Python là các bước được thực thi như một khối mã chỉ khi được gọi. Chúng được định nghĩa độc lập với bất kỳ đối tượng lớp nào, có nghĩa là chúng có thể được gọi trực tiếp bằng tên của chúng. Vì chúng không được liên kết với bất kỳ lớp nào, chúng ta không phải chuyển self làm tham số - các tham số là tùy chọn. 

Về bản chất, một hàm chỉ đơn giản là một tập hợp các lệnh được xác định rõ ràng mà trình thông dịch sử dụng để thực hiện một tác vụ. 

# Example of a function
def run():
  print("I am running.")
​
run()

"""
I am running.
"""

Như đã tìm hiểu trong bài viết Cách gọi và viết hàm của chúng tôi , các hàm cũng có hai loại khác nhau: cài sẵn và do người dùng định nghĩa. 

  • Các hàm dựng sẵn: Các hàm có trong thư viện chuẩn Python.
  • Các hàm do người dùng định nghĩa: Các hàm do người dùng xác định - Python cho phép người dùng xác định và sử dụng các hàm của riêng họ có thể được truy cập trong một chương trình Python.

Theo nhiều khía cạnh, các phương thức và hàm giống hệt nhau - tức là chúng đều được định nghĩa bằng một câu lệnh def. Sự khác biệt cơ bản là các phương thức được liên kết với một đối tượng và được sử dụng để hoạt động trên dữ liệu được chứa trong một lớp, trong khi các hàm được định nghĩa độc lập và có thể được gọi bằng tên của chúng ở bất kỳ đâu trong chương trình. 

Các phương pháp phép thuật trong Python là gì?

Ở phần đầu của hướng dẫn, chúng tôi đã đề cập rằng các phương thức ma thuật còn được gọi là phương thức dunder do cấu trúc dấu gạch dưới kép của chúng. Ý của chúng tôi là tất cả các phương thức ma thuật Python đều bắt đầu và kết thúc bằng hai dấu gạch dưới. 

 

Phương thức ma thuật được công nhận nhiều nhất là phương thức __init__, cho phép khởi tạo một lớp với các thuộc tính cụ thể. 

class Employee:
    def __init__(self, name, age, role):
        self.name = name
        self.age = age
        self.role = role

Để khởi tạo một cá thể của lớp này, chúng ta phải chỉ định các thuộc tính tên, tuổi và vai trò của cá thể đó. Ví dụ:

user_1 = Employee(name="John", age=24, role="Data Scientist")

Nếu không làm như vậy sẽ gây ra lỗi TypeError

 

Phương thức __init__ thuộc danh mục phương thức ma thuật khởi tạo và xây dựng, nhưng nó chỉ là một trong nhiều phương thức. Bảng dưới đây trình bày chi tiết một số phương pháp khởi tạo và xây dựng ma thuật khác. 

 

__new __ (cls, other)Được sử dụng để tạo một phiên bản mới của một lớp
__init __ (bản thân, khác)Được gọi sau khi một phiên bản mới đã được tạo; Tất cả các thuộc tính được truyền cho biểu thức phương thức khởi tạo lớp sẽ được sử dụng làm thuộc tính. 
__del __ (bản thân)Còn được gọi là bộ hủy; Được gọi khi một thể hiện sẽ bị phá hủy. 

Cách đơn giản nhất để khái niệm các phương thức ma thuật có thể là liên hệ giữa việc triển khai của bạn và trình thông dịch python. Một trong những điều khoản trong hợp đồng yêu cầu Python thực hiện một số hành động trong một số trường hợp cụ thể, chẳng hạn như khởi tạo một cá thể lớp với các đối tượng cụ thể. 

 

Nói cách khác, bạn không có trách nhiệm gọi một phương thức ma thuật trực tiếp bằng cách gọi nó - Python làm điều đó cho bạn đằng sau hậu trường. 

Phương pháp biểu diễn chuỗi

Python là một ngôn ngữ lập trình hướng đối tượng (OOP) - mọi thứ trong Python đều là một đối tượng. Khi một đối tượng mới được tạo, chúng ta mặc nhiên tạo một đối tượng có liên quan vì tất cả các lớp đều kế thừa từ đối tượng.  

 

Lưu ý: bạn cũng có thể làm cho kế thừa rõ ràng bằng cách chuyển đối tượng lớp vào lớp của bạn. 

# This works
class Car:
  pass
​
# This also works
class Vehicle(object):
  pass
​
car = Car()
vehicle = Vehicle()
​
print(car, vehicle, sep="\n")

"""
<__main__.Car object at 0x7f80449dc0a0>
<__main__.Vehicle object at 0x7f80449dc1f0>
"""

Trong đoạn mã trên, chúng ta đã tạo hai lớp trống, nhưng trình thông dịch Python vẫn biết những gì cần in khi chúng ta gọi câu lệnh in. Điều này có thể thực hiện được vì tất cả các lớp kế thừa từ lớp đối tượng (lớp cha của tất cả các lớp trong Python) và nó có một phương thức ma thuật được gọi là __repr__, trong đó câu lệnh print sẽ trả về một giá trị trở lại chương trình chính của chúng ta.  

 

Những người quen thuộc với kế thừa sẽ biết rằng một lớp con có thể ghi đè lên lớp cha của nó bằng cách định nghĩa phương thức riêng của nó có cùng tên. 

# Overriding the object __repr__
class Vehicle:
  def __repr__(self):
      return f"{self.__class__.__qualname__}"
​
vehicle = Vehicle()
print(vehicle)

"""
Vehicle
"""

Bạn cũng có thể sử dụng phương thức ma thuật __str__ để tạo biểu diễn chuỗi được gọi với câu lệnh in. 

 

Trên thực tế, phương thức ma thuật __repr__ đóng vai trò là hành vi sao lưu vào phương thức ma thuật __str__. Do đó, khi chúng ta gọi câu lệnh print, trước tiên Python sẽ tìm phương thức __str__ được định nghĩa trong lớp của bạn trước khi quay lại phương thức __repr__. 

# Using __str__ for string representation
class Vehicle:
  def __str__(self):
      return f"{self.__class__.__qualname__}"
     
vehicle = Vehicle()
print(vehicle)

"""
Vehicle
"""

Bảng dưới đây bao gồm danh sách các phương thức ma thuật biểu diễn chuỗi khác. 

 

__str __ (bản thân)Được gọi bằng hàm str () tích hợp của Python và bằng câu lệnh print để hiển thị biểu diễn chuỗi không chính thức của một đối tượng. Lưu ý rằng nó không bắt buộc phải là một biểu thức Python hợp lệ. 
__repr __ (bản thân)Được gọi bằng hàm repr () tích hợp của Python và các chuyển đổi chuỗi để hiển thị biểu diễn chuỗi chính thức của một đối tượng. Lưu ý rằng điều này sẽ trông giống như một biểu thức Python hợp lệ, nhưng một chuỗi có mô tả hữu ích sẽ được ưu tiên nếu điều này không thể thực hiện được. 
__unicode __ (bản thân)Được gọi để triển khai hàm unicode () có sẵn của Python và trả về một đối tượng Unicode. 
__hash __ (bản thân)Được gọi bằng hàm băm () tích hợp của Python và các hoạt động trên các thành viên của bộ sưu tập được băm. Phương thức sẽ trả về một số nguyên. 
__nonzero __ (tự)Được gọi bằng hoạt động bool () tích hợp của Python để triển khai kiểm tra giá trị sự thật. Phương thức phải trả về True hoặc False (hoặc số nguyên tương đương 1 hoặc 0 của chúng). 

 

Các phương pháp "ma thuật" đóng gói 

Đóng gói là một trong những khái niệm cơ bản trong lập trình hướng đối tượng (OOP). Nó đề cập đến việc đóng gói dữ liệu với các phương thức hoạt động trên dữ liệu đó hoặc hạn chế quyền truy cập trực tiếp vào các thành phần nhất định trong một đối tượng.

 

Các nhà phát triển đến từ các ngôn ngữ OOP khác thường xuyên tranh cãi về sự thất bại của Python trong việc nắm bắt tính năng đóng gói cho các lớp thực sự. Những người này quen với việc có các công cụ sửa đổi rõ ràng cho các phương thức hoặc trường cho phép họ xác định những thứ, chẳng hạn như thuộc tính private với getters và setters công khai. Sự khác biệt trong Python là phần lớn sự đóng gói hiện có xảy ra thông qua các phương thức ma thuật. 

 

Ví dụ: __setattr__ là một giải pháp đóng gói cho phép chúng tôi xác định hành vi để gán cho một thuộc tính bất chấp sự hiện diện của nó. Nói cách khác, các quy tắc có thể được xác định cho những thay đổi trong giá trị của các thuộc tính. 

import string

class Alphabet():
    def __setattr__(self, name, value):
        self.__dict__[name] = value.upper()

a = Alphabet()

# Assinging an attribute that does not exist
# The setattr should convert it to caps despite being set as lowercase
a.alphabet = string.ascii_lowercase
print(a.alphabet)

Trong đoạn mã trên, chúng tôi đã tạo một lớp có tên là Alphabet không có thuộc tính nào, nhưng chúng tôi đã nói với Python rằng chúng tôi muốn viết hoa bất kỳ thuộc tính nào của cá thể lớp mà chúng tôi đặt.

 

Chúng tôi hiểu rằng OOP có thể hơi xa tầm với đối với một số độc giả. Để bắt đầu với OOP bằng Python, hãy xem Theo dõi lập trình viên Python của DataCamp .   

Phương pháp toán học ma thuật

Một danh mục khác của các phương pháp phép thuật trong Python là các phương pháp phép thuật toán học (còn được gọi là các toán tử số học bình thường). Các biểu thức được tạo bằng cách sử dụng các ký hiệu đặc biệt mà chúng tôi gọi là 'toán tử' trong Python. Sử dụng các toán tử như vậy trong một biểu thức liên quan đến việc tạo ra các đối tượng bằng các phương pháp toán học. Việc không tuân thủ quy tắc này sẽ gây ra lỗi TypeError. 

class Numbers:
  def __init__(self, a, b):
      self.a = a
      self.b = b
   
set_a = Numbers(2, 4)
set_b = Numbers(3, 5)
​
print(set_a + set_b)
"""
---------------------------------------------------------------------------
TypeError                                 Traceback (most recent call last)
/tmp/ipykernel_152/3639634723.py in <module>
      7 set_b = Numbers(3, 5)
      8
----> 9 print(set_a + set_b)

TypeError: unsupported operand type(s) for +: 'Numbers' and 'Numbers'
"""

Trong đoạn mã trên, chúng tôi đã cố gắng tạo nhiều phiên bản của Số lớp và thêm chúng lại với nhau, điều này đã gây ra lỗi như mong đợi. Một giải pháp cho lỗi này có thể là tạo một phương thức trong lớp của chúng tôi để cộng các số lại với nhau, nhưng điều này sẽ ngăn chúng tôi tạo biểu thức. 

 

Giải pháp tốt hơn sẽ là triển khai phương thức ma thuật __add__ như sau:  

# Using add operator
class Numbers:
    def __init__(self, a, b):
        self.a = a
        self.b = b
   
    def __add__(self, other):
        # Only permit Numbers objects to be added
        if not isinstance(other, Numbers):
            return NotImplemented
        return Numbers(other.a + self.a, other.b + self.b)
   
    def __repr__(self):
      return f"{self.__class__.__qualname__}({self.a}, {self.b})"
   
a = Numbers(2, 4)
b = Numbers(3, 5)
print(a + b) # Should result in Numbers(5, 9)


"""
RandomNumbers(5, 9)
"""

Ví dụ mã ở trên chỉ cho phép chúng ta thêm hai đối tượng Numbers với nhau. Hãy triển khai một phương pháp toán học kỳ diệu khác cho phép chúng ta nhân một đối tượng Numbers với một số nguyên. 

# Multiplying Numbers with an integer
class Numbers:
    def __init__(self, a, b):
        self.a = a
        self.b = b
   
    def __add__(self, other):
        # Only permit Numbers objects to be added
        if not isinstance(other, Numbers):
            return NotImplemented
        return Numbers(other.a + self.a, other.b + self.b)
   
    def __mul__(self, other):
      if not isinstance(other, int):
          return NotImplemented
         
      return Numbers(self.a * other, self.b * other)
   
    def __repr__(self):
      return f"{self.__class__.__qualname__}({self.a}, {self.b})"
   
a = Numbers(2, 4)
print(a * 5) # Should return 10, 20




"""
RandomNumbers(10, 20)
"""

Trong đoạn mã trên, chúng tôi đã thêm một phương thức ma thuật __mul__ để cho phép chúng tôi nhân các số của lớp tùy chỉnh của chúng tôi với một số nguyên. 

 

Lưu ý rằng đối tượng Numbers xuất hiện ở phía bên trái của toán tử * - điều này không phải ngẫu nhiên. Hãy đặt nó ở phía bên phải của toán hạng và quan sát điều gì sẽ xảy ra. 

- snip --

a = Numbers(2, 4)
print(3 * a)
---------------------------------------------------------------------------
TypeError                                 Traceback (most recent call last)
/tmp/ipykernel_152/2857655049.py in <module>
      1 a = Numbers(2, 4)
----> 2 print(3 * a)

TypeError: unsupported operand type(s) for *: 'int' and 'Numbers'

Python ném ra một TypeError. 

 

Phương thức ma thuật __mul__ mà chúng tôi đã triển khai chỉ tính đến khi đối tượng Numbers nằm ở phía bên trái của toán tử *. Để mở rộng chức năng này, chúng ta phải thêm phương thức phép thuật ngược lại, __rmul__. 

# Enabling reverse multiplication
class Numbers:
    def __init__(self, a, b):
        self.a = a
        self.b = b
   
    def __add__(self, other):
        # Only permit Numbers objects to be added
        if not isinstance(other, Numbers):
            return NotImplemented
        return Numbers(other.a + self.a, other.b + self.b)
   
    def __mul__(self, other):
      if not isinstance(other, int):
          return NotImplemented
      return Numbers(self.a * other, self.b * other)

    def __rmul__(self, other):
        return self.__mul__(other)
   
    def __repr__(self):
      return f"{self.__class__.__qualname__}({self.a}, {self.b})"
   
a = Numbers(2, 4)
print(5 * a) # Should return 10, 20

"""
Numbers(10, 20)
"""

Bây giờ chúng ta có thể tạo một biểu thức nhân mà không cần phải xem xét mặt nào của toán hạng mà đối tượng Numbers xuất hiện. 

Gói (lại

Nguyên tắc cơ bản để tận dụng các phương thức ma thuật Python vẫn giữ nguyên: tạo một lớp và ghi đè phương thức ma thuật lớp đối tượng. Có rất nhiều phương pháp ma thuật trong Python, có nghĩa là nó sẽ là một hướng dẫn cực kỳ dài nếu chúng tôi quyết định trình bày tất cả chúng một cách riêng lẻ. Chúng tôi thực sự khuyên bạn nên xem tài liệu Python để có ý tưởng về phạm vi đầy đủ của các phương pháp ma thuật Python mà bạn có thể sử dụng để nâng cao kỹ năng lập trình Python của mình .  

Liên kết: https://www.datacamp.com/tutorial/introductioning-python-magic-methods

#python

Art  Lind

Art Lind

1602968400

Python Tricks Every Developer Should Know

Python is awesome, it’s one of the easiest languages with simple and intuitive syntax but wait, have you ever thought that there might ways to write your python code simpler?

In this tutorial, you’re going to learn a variety of Python tricks that you can use to write your Python code in a more readable and efficient way like a pro.

Let’s get started

Swapping value in Python

Instead of creating a temporary variable to hold the value of the one while swapping, you can do this instead

>>> FirstName = "kalebu"
>>> LastName = "Jordan"
>>> FirstName, LastName = LastName, FirstName 
>>> print(FirstName, LastName)
('Jordan', 'kalebu')

#python #python-programming #python3 #python-tutorials #learn-python #python-tips #python-skills #python-development

Art  Lind

Art Lind

1602666000

How to Remove all Duplicate Files on your Drive via Python

Today you’re going to learn how to use Python programming in a way that can ultimately save a lot of space on your drive by removing all the duplicates.

Intro

In many situations you may find yourself having duplicates files on your disk and but when it comes to tracking and checking them manually it can tedious.

Heres a solution

Instead of tracking throughout your disk to see if there is a duplicate, you can automate the process using coding, by writing a program to recursively track through the disk and remove all the found duplicates and that’s what this article is about.

But How do we do it?

If we were to read the whole file and then compare it to the rest of the files recursively through the given directory it will take a very long time, then how do we do it?

The answer is hashing, with hashing can generate a given string of letters and numbers which act as the identity of a given file and if we find any other file with the same identity we gonna delete it.

There’s a variety of hashing algorithms out there such as

  • md5
  • sha1
  • sha224, sha256, sha384 and sha512

#python-programming #python-tutorials #learn-python #python-project #python3 #python #python-skills #python-tips