数据结构与算法(Python语言描述)P86和P88判断谓词和谓词参数的理解

1.书中说的"判断谓词"和"谓词参数"

P86页代码如下:

def find(self, pred):
    p = self._head
    while p is not None:
        if pred(p.elem):
            return p.elem
        p = p.next

这里的 pred 是一个函数,相当于形参里参入一个实现判断功能的函数,对于Python语言传入函数名即可。理解如下:

假如我们定义一个find函数如下:

def find(num:[list], pred):
    for x in num:
        if pred(x):
            return x
    pass

该函数相当于把 num 进行遍历,num里的每一个元素都调用 pred()。

def equals(elem):
    return elem == 1

定义 equals(elem) 判断elem是否等于1,等于1则返回True,否则返回False。调用find()函数:

res = find([9, 1, 2, 3, 1, 2, 3], equals)
print(res)

image-20220318090807033

结果是返回num列表里第一个与1相当的数。

equal()方法可以使用匿名函数(lambda表达式)实现:

res = find(num, lambda x: x == 1)
print("Use lambda:{0}".format(res))

image-20220318091100844

2.使用生成器

上边找到的是num里与1相等的第1个元素的值,假如要找到num里与1相等的所有的值,这里我们使用生成器函数,把满足条件的放到生成器里面,然后进行迭代:

def filter(num:[list], pred):  # 生成器函数
    for x in num:
        if pred(x):
            yield x
    pass
# 迭代器
print('----------------------------')
for x in filter(num, lambda x: x == 1):
    print(x)

image-20220318093211819

3.使用C语言测试

由于C语言里没有匿名函数,所以我们使用 形参里使用函数名:

#include<stdio.h>

int equals(int elem){
	return elem == 1;
}

int find(int a[], int len, int (*fun)(int x) ){   //指向函数的指针 
	int i;
	for(i = 0; i < len; i++){
		if(fun(a[i])) 
			return a[i];
	}
}

void main(){
	int a[] = {1, 2, 3, 4, 5, 6};
	int len = 6;
	printf("len = %d\n", len); 
	int res = find(a, len, equals);
	printf("res = %d\n", res);
} 

注意:

int (*fun)(int x)
    
find(a, len, equals);

这里是指向函数的指针,相当于函数作为形参,调用时实参使用函数名即可。

个人理解,如有不对的地方,请大家指正,谢谢。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值