python函数式编程和命令式编程_python 学习汇总51:命令式、声明式和函数式编程(入门学习- tcy)...

编程范式:命令式、声明式和函数式编程

2018/11/18

主要的编程范式有三种:命令式编程,声明式编程和函数式编程。

命令式编程:

主要思想是关注计算机执行的步骤,即一步一步告诉计算机先做什么再做什么。比如:如果你想在一个数字集合 collection(变量名) 中筛选大于 5 的数字,你需要这样告诉计算机:

第一步,创建一个存储结果的集合变量 results;第二步,遍历这个数字集合 collection;第三步:一个一个地判断每个数字是不是大于 5,如果是就将这个数字添加到结果集合变量 results 中

List results = new List();

foreach(var num in collection)

{if (num > 5)results.Add(num);}

这样的代码是很常见不管你用 C, C++ 还是 C#, Java, Javascript,, Python, Ruby 等都可以以这个方式写。

声明式编程:

以数据结构形式来表达程序执行的逻辑。主要思想是告诉计算机应该做什么,但不指定具体要怎么做。

SQL 语句,网页编程中用到的 HTML 和 CSS 也都属于声明式编程。

特点是不需要创建变量用来存储数据,不包含循环控制的代码如 for, while。例如:

SELECT * FROM collection WHERE num > 5

Python中的声明式编程用列表推导式

1.list,dict,set推导

n = 10

a = [n * n for n in nums] # 列表推导新建命名空间,n为局部变量

code_No= [(86, 'China'),(91, 'India'),(81, 'Japan')]

dict(code_No) # {86: 'China', 91: 'India', 81: 'Japan'}

{k:v for v,k in code_No} # {'China': 86, 'India': 91, 'Japan': 81}

from unicodedata import name

{chr(i) for i in range(32, 256) if 'SIGN' in name(chr(i), '')}#集合的排序无关紧要

# {'×', '¥', '°', '£', '©', '#', '¬', '%', 'µ', '>', '¤', '±', '¶', '§', '

2.生成器表达式

b = (10 * i for i in [1, 2, 3])

函数式编程:

关注做什么而不是怎么做。无需告诉计算机去做什么,而是为它提供一些必要的信息。如数字最大公约数,1到n的乘积是多少。

最重要特点是“函数第一位”,即函数可以出现在任何地方,用作参数,作为返回值。常见编程语言支持这种编程方式,如 Lambda 和闭包的概念。

变量无法改变,一旦设置会保存初始状态。函数不会产生“副作用”(函数可能会修改外部变量的值)

在函数式编程中,改变变量是大忌,让函数改变外部变量也是绝对禁止。

函数唯一能做的事是执行计算然后返回结果。

在函数式编程中,我们不使用循环。而是用递归,函数将自己作为子函数反复调用。

1.普通函数:

# 0.普通函数定义

def func(b):

global a

return a+b

a = 3

print(func(4))

2.偏函数:函数参数简化:

#functools.partial可以创建一个新的函数

fun= functools.partial(int, base=2)# 声明一个fun的函数

fun("1000") # 结果是10进制 8

3.lambda、常函数:

fun = lambda x: x**2

fun(2) #4

4.递归函数:

def factorial_recursive(n):

return 1 if n == 1 else return n * factorial_recursive(n-1)

5.高阶函数,闭包:

def i_sum(n):return sum(n)

def sum_fun(func, n):return func(n)

sum_fun(i_sum, [1, 2, 3])# 6

6.迭代器

# map&filter 可以实现列表解析式同样的事情

1)iter=map(fun,seq)#将序列中元素全部传递给一个函数;两个输入

def fun(x):return x ** 2

a = list(map(fun, [1, 2, 3, 4]))

a = list(map(lambda x: x * x, [1, 2, 3, 4]))#[1, 4, 9, 16]

2)filter(fun,seq)#用于过滤序列函数返回值True 保留

seq = ["foo", "x41", "?!", "***"]

def func(x): return x.isalnum()

filter(func, seq) # ['foo', 'x41']

def is_odd(n):return n % 2 == 1

a = list(filter(is_odd, [1, 2, 4, 5]))

3).reduce

from functools import reduce

def fn(x, y):return x * 10 + y

a = reduce(fn, [1, 3, 4, 7]) #序列变整数#1347

cum = 0

a = [1, 3, 4, 7]

for i in a: cum =cum*10 +i

def prod(lst=[]): #reduce()函数 list求积:

def fun(x,y):return x * y

return reduce(fun,lst)

a = prod([1,2,3,4,5,6,7,8]) # 40320

4)sorted()

some_list = [(1, 3), (5, 2), (6, 1), (4, 6)]

some_list.sort(key=lambda x: x[0]**2 - x[1]*3)

some_list #[(1, 3), (4, 6), (5, 2), (6, 1)]

7.with语句:

with open("E:\python\data\stock_entrust.txt",'r') as f:

content=f.readlines()

content=[line for line in open("E:\python\data\stock_entrust.txt",'r')]

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值