python內(nèi)建的filter用于過(guò)濾序列鳍征,也可以接收函數(shù)。
和map()不同的是面徽,filter()把傳入的函數(shù)依次作用于每個(gè)元素艳丛,然后根據(jù)返回值是True還是False決定保留還是丟棄該元素。
#!/usr/bin/env python
# -*- coding: utf-8 -*-
# @Date : 2017/11/24 0024
# @Author : TaoYuan (1876665310@qq.com)
# @Link : http://blog.csdn.net/lftaoyuan Python互助學(xué)習(xí)qq群:315857408
# @Version : V1.0.0
L1 = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
L2 = ['A', 'B', 'c', None, ' ']
def is_odd(n): # 是否奇數(shù)
return n % 2 == 1
def not_empty(s): # 不為空
return s and s.strip()
if __name__ == '__main__':
print(list(filter(is_odd, L1))) # [1, 3, 5, 7, 9]
print(list(filter(not_empty, L2))) # ['A', 'B', 'c']
埃氏篩法
計(jì)算素?cái)?shù)(質(zhì)數(shù))的一種方法趟紊。
流程大致如下:
- 列出大于等于2的所有自然數(shù)
2,3,4,5,6,7,8,9...
- 取序列的第一個(gè)數(shù)2(一定是素?cái)?shù))氮双,篩掉2和2的所有倍數(shù)
3,5,7,9...
- 取新序列的第一個(gè)數(shù)3(一定是素?cái)?shù)),篩掉3和3的所有倍數(shù)
5,7,11...
- 然后取5...不斷篩下去霎匈,就可以得到所有的素?cái)?shù)戴差。
def odd_iter(): # 奇數(shù)生成器
n = 1
while True:
n += 2
yield n
def not_divisible(n): # 篩選函數(shù)
return lambda x: x % n > 0
def primes(): # 生成素?cái)?shù)列表
yield 2
it = odd_iter() # 初始序列
while True:
n = next(it) # 返回序列的第一個(gè)數(shù)
yield n
it = filter(not_divisible(n), it) # 構(gòu)造新序列
if __name__ == '__main__':
# 打印100以內(nèi)的素?cái)?shù):
for n in primes():
if n < 100:
print(n)
else:
break
回?cái)?shù)
回?cái)?shù)是指從左向右讀和從右向左讀都是一樣的數(shù),例如12321铛嘱,909暖释。
先去百科一下“回?cái)?shù)”,發(fā)現(xiàn)它的解法也比較簡(jiǎn)單:
數(shù)學(xué)中有一個(gè)著名的回?cái)?shù)猜想至今沒(méi)有解決回?cái)?shù)猜想的內(nèi)容是你任取一個(gè)自然數(shù)把這個(gè)數(shù)倒過(guò)來(lái)并將這兩個(gè)數(shù)相加然后把這個(gè)和數(shù)再倒過(guò)來(lái)與原來(lái)的和數(shù)相加重復(fù)這個(gè)過(guò)程一定能獲得一個(gè)回?cái)?shù)
舉個(gè)例子比如68按上述法進(jìn)行計(jì)算
68+86=154
154+451=605
605+506=1111
只需三步就可以得到一個(gè)回文數(shù)
請(qǐng)利用filter()篩選出回?cái)?shù):
#!/usr/bin/env python
# -*- coding: utf-8 -*-
# @Date : 2017/11/24 0024
# @Author : TaoYuan (1876665310@qq.com)
# @Link : http://blog.csdn.net/lftaoyuan Python互助學(xué)習(xí)qq群:315857408
# @Version : V1.0.0
# @des : 判斷是否為回?cái)?shù)
def is_palindrome(n):
return str(n) == str(n)[::-1] # 字符串倒過(guò)來(lái)如果==字符串墨吓,則為回?cái)?shù)
if __name__ == '__main__':
# 測(cè)試:
output = filter(is_palindrome, range(1, 1000))
print('1~1000:', list(output))
if list(filter(is_palindrome, range(1, 200))) == [1, 2, 3, 4, 5, 6, 7, 8, 9, 11, 22, 33, 44, 55, 66, 77, 88, 99,
101, 111, 121, 131, 141, 151, 161, 171, 181, 191]:
print('測(cè)試成功!')
else:
print('測(cè)試失敗!')