1.19 python--生成式,高阶函数

1、集和生成式,列表生成式,字典生成式

1)集合生成式

练习

print({i ** 2 for i in {1,2,3,3}})
print({i ** 2 for i in {1,2,3,9,12,9} if i % 3 == 0 })

结果

{1, 4, 9}
{81, 9, 144}

2)列表生成式

练习1:输出圆的半径

找出1-10之间的所有偶数,
# 并返回一个列表(包含以这个偶数为半径的圆的面积)

代码:

import math

a = math.pi
print(a)

print([math.pi * r * r for r in range(2, 11, 2)])

结果

3.141592653589793
[12.566370614359172, 50.26548245743669, 113.09733552923255, 201.06192982974676, 314.1592653589793]

练习2:判断质数

找出1~100之间所有的质数

代码:

def fun(num):
    for i in range(2, num):
        if num % i == 0:
            return False
    else:
        return True


print([i for i in range(2, 101) if fun(i)])

结果:

[2, 3, 5, 7, 11, 13, 17, 19, 23, 29, 31, 37, 41, 43, 47, 53, 59, 61, 67, 71, 73, 79, 83, 89, 97]

练习3:

- 题目描述:
给定一个正整数,编写程序计算有多少对质数的和等于输入的这个正整
数,并输出结果。输
入值小于1000。
如,输入为10, 程序应该输出结果为2。(共有两对质数的和为10,分别
为(5,5),(3,7))
# [2,3,5,7]
- 输入描述:
输入包括一个整数n,(3 ≤ n < 1000)
- 输出描述:
输出对数
- 示例1 :
```
输入:
    10
输出:
    2

代码:

num = int(input())


def isPrime(num):
    for i in range(2, num):
        if num % i == 0:
            return False
    else:
        return True


primeli = [i for i in range(2, num) if isPrime(i)]
print(primeli)

"""
1.先从列表中拿出两个数
2.判断两个数之和是否等于num
"""
# [2,3,5,7] # 2 10 -2 =8
primecount = 0

for item in primeli:
    if (num - item) in primeli and item <= num - item:
        primecount += 1
print(primecount)

结果:

20
[2, 3, 5, 7, 11, 13, 17, 19]
2

3)字典生成式

练习1:字典的key转换为大写

代码:

d = dict(a=1,b=2)
print(d)

new_d = {}
for i in d:
    new_d[i.upper()] = d[i]

# print('key转化为大写的字典:',new_d)
print({k.upper():v for k,v in d.items()})

结果:

{'a': 1, 'b': 2}
{'A': 1, 'B': 2}

练习2:大小写的和

d = dict(a=2,b=1,c=2,B=9,A=10)
#输出{'a':12,'b':10,'c':2}

代码:

d = dict(a=2,b=1,c=2,B=9,A=10)
new_d = {}
for k,v in d.items():
    low_k = k.lower()
    if low_k not in new_d:
        new_d[low_k] = v
    else:
        new_d[low_k] += v

print(new_d)

print({k.lower(): d.get(k.lower(),0) + d.get(k.upper(),0) for k in d})

结果:

{'a': 12, 'b': 10, 'c': 2}
{'a': 12, 'b': 10, 'c': 2}

2、高阶函数

1)、高阶函数的概念

高阶函数:
    实参是一个函数名
    函数的返回值也是一个函数

abs 和 abs()的区别:
abs为函数整体
abs()为返回值

#函数本身也可以赋值给变量,变量也可以指向函数
# f = abs
# print(f(-10))

#传递的参数包括函数名

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

print(fun(-10,34,abs))

(10, 34)

2)、内置的高阶函数

一、map函数

map()函数接收两个参数,一个是函数,一个是序列
map将传入的函数依次作用到序列的每个元素,并且
把结果作为新的序列返回

练习1:对于序列[-1,3,-5,-4]的每个元素求绝对值

print(list(map(abs,[-1,3,-5,-4])))

[1, 3, 5, 4]

练习2:对于序列的每个元素求阶乘(10个,2~7之间的随机)

代码:

import random
def factoria(x):
    res = 1
    for i in range(1,x+1):
        res *= i
    return res

li = [random.randint(2,7) for i in range(10)]
print(list(map(factoria,li)))

结果:

[2, 720, 5040, 6, 120, 24, 5040, 120, 120, 5040]

 

二、reduce函数

reduce:把一个函数作用在一个序列上,这个函数必须接收两个
参数,reduce把结果继续和序列的下一个元素累计计算
reduce(f,[x1,x2,x3,x4,x5]) = f(f(f(f(x1,x2),x3),x4),x5)

使用时,需要导入。from functools import reduce

累乘
累加

from functools import reduce

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

print(reduce(multi,range(1,4)))

def add(x,y):
    return x + y

print(reduce(add,[1,2,3,4,5]))

结果:

6
15

三、filter过滤函数

filter过滤函数
和map类似,也接收一个函数和一个序列
但是和map不同的是,filter把传入的函数依次作用于每个元素
然后根据返回值是True还是False决定保留还是丢弃该元素

练习:判断质数

def fun(num):
    for i in range(2, num):
        if num % i == 0:
            return False
    else:
        return True
print(list(filter(fun,range(2,100))))

结果:

[2, 3, 5, 7, 11, 13, 17, 19, 23, 29, 31, 37, 41, 43, 47, 53, 59, 61, 67, 71, 73, 79, 83, 89, 97]

猜你喜欢

转载自blog.csdn.net/qq_41627390/article/details/86556095