- Functional Python Programming
- Steven F. Lott
- 598字
- 2021-08-27 19:20:20
Subdividing the procedural paradigm
We can subdivide imperative languages into a number of discrete categories. In this section, we'll glance quickly at the procedural versus object-oriented distinction. What's important here is to see how object-oriented programming is a subset of imperative programming. The distinction between procedural and object-orientation doesn't reflect the kind of fundamental difference that functional programming represents.
We'll use code examples to illustrate the concepts. For some, this will feel like reinventing the wheel. For others, it provides a concrete expression of abstract concepts.
For some kinds of computations, we can ignore Python's object-oriented features and write simple numeric algorithms. For example, we might write something like the following to sum a range of numbers that share a common property:
s = 0 for n in range(1, 10): if n % 3 == 0 or n % 5 == 0: s += n print(s)
The sum s includes only numbers that are multiples of three or five. We've made this program strictly procedural, avoiding any explicit use of Python's object features. The program's state is defined by the values of the variables s and n. The variable n takes on values such that 1 ≤ n < 10. As the loop involves an ordered exploration of values of n, we can prove that it will terminate when n == 10. Similar code would work in C or Java language, using their primitive (non-object) data types.
We can exploit Python's Object-Oriented Programming (OOP) features and create a similar program:
m = list() for n in range(1, 10): if n % 3 == 0 or n % 5 == 0: m.append(n) print(sum(m))
This program produces the same result but it accumulates a stateful collection object, m, as it proceeds. The state of the computation is defined by the values of the variables m and n.
The syntax of m.append(n) and sum(m) can be confusing. It causes some programmers to insist (wrongly) that Python is somehow not purely object-oriented because it has a mixture of the function()and object.method() syntax. Rest assured, Python is purely object-oriented. Some languages, such as C++, allow the use of primitive data types such as int, float, and long, which are not objects. Python doesn't have these primitive types. The presence of prefix syntax, sum(m), doesn't change the nature of the language.
To be pedantic, we could fully embrace the object model, by defining a subclass of the list class. This new class will include a sum method:
class Summable_List(list):
def sum(self):
s = 0
for v in self:
s += v
return s
If we initialize the variable m with an instance of the Summable_List() class instead of the list() method, we can use the m.sum() method instead of the sum(m) method. This kind of change can help to clarify the idea that Python is truly and completely object-oriented. The use of prefix function notation is purely syntactic sugar.
All three of these examples rely on variables to explicitly show the state of the program. They rely on the assignment statements to change the values of the variables and advance the computation toward completion. We can insert the assert statements throughout these examples to demonstrate that the expected state changes are implemented properly.
The point is not that imperative programming is broken in some way. The point is that functional programming leads to a change in viewpoint, which can, in many cases, be very helpful. We'll show a function view of the same algorithm. Functional programming doesn't make this example dramatically shorter or faster.
- GitLab Cookbook
- Delphi程序設計基礎:教程、實驗、習題
- 移動UI設計(微課版)
- Visual Studio 2012 Cookbook
- SQL Server 2016從入門到精通(視頻教學超值版)
- C和C++安全編碼(原書第2版)
- Java持續交付
- 重學Java設計模式
- Getting Started with NativeScript
- 網站構建技術
- Hands-On Full Stack Development with Go
- Swift語言實戰精講
- Visual Basic 6.0程序設計實驗教程
- QGIS Python Programming Cookbook(Second Edition)
- Android Studio Cookbook