いわゆる組み込み関数はインポートせずに直接使用できます。以下の記事では、Python の基本的な学習に役立ついくつかの一般的な組み込み関数をサンプル コードを通して詳しく紹介しています。必要な方は、エディターを使って学習しましょう。
はじめに
Python には、多くの型を処理するための多数の組み込み関数が用意されており、これらの組み込み関数の機能は、多くの場合、複数の型のオブジェクトに対して同様の操作、つまり複数のオブジェクトの操作を実行できることです。以下の一般的な操作については説明する必要はありません。詳細を見てみましょう。
map()
map() 関数は 2 つのパラメーターを受け入れます。1 つは関数、もう 1 つは反復可能オブジェクトです (Iterable) は、受信した関数を反復可能オブジェクトの各要素に順番に適用します。そして結果をイテレータとして返します。
たとえば、関数 f(x)=x^2
があり、この関数は list[1,2,3,4,5,6] に適用する必要があります。 ,7 ,8,9]
について: f(x)=x^2
,要把这个函数作用到一个list[1,2,3,4,5,6,7,8,9]
上:
运用简单的循环可以实现:
>>> def f(x): ... return x * x ... L = [] for n in [1, 2, 3, 4, 5, 6, 7, 8, 9]: L.append(f(n)) print(L)
运用高阶函数map()
:
>>> r = map(f, [1, 2, 3, 4, 5, 6, 7, 8, 9]) >>> list(r) [1, 4, 9, 16, 25, 36, 49, 64, 81]
结果r是一个迭代器,迭代器是惰性序列,通过list()
函数让它把整个序列都计算出来并返回一个list。
如果要把这个list所有数字转为字符串利用map()
就简单了:
>>> list(map(str, [1, 2, 3, 4, 5, 6, 7, 8, 9])) ['1', '2', '3', '4', '5', '6', '7', '8', '9']
小练习:利用map()
函数,把用户输入的不规范的英文名字变为首字母大写其他小写的规范名字。输入['adam', 'LISA', 'barT'],
输出['Adam', 'Lisa', 'Bart']
def normalize(name): return name.capitalize() l1=["adam","LISA","barT"] l2=list(map(normalize,l1)) print(l2)
reduce()
reduce()
函数也是接受两个参数,一个是函数,一个是可迭代对象,reduce将传入的函数作用到可迭代对象的每个元素的结果做累计计算。然后将最终结果返回。
效果就是:reduce(f, [x1, x2, x3, x4]) = f(f(f(x1, x2), x3), x4)
举例说明,将序列[1,2,3,4,5]
变换成整数12345:
>>> from functools import reduce >>> def fn(x, y): ... return x * 10 + y ... >>> reduce(fn, [1, 2, 3, 4, 5]) 12345
小练习:编写一个prod()
函数,可以接受一个list并利用reduce求积:
from functools import reduce def pro (x,y): return x * y def prod(L): return reduce(pro,L) print(prod([1,3,5,7]))
map()
和reduce()
综合练习:编写str2float函数,把字符串'123.456'转换成浮点型123.456
CHAR_TO_FLOAT = { '0': 0,'1': 1,'2': 2,'3': 3,'4': 4,'5': 5,'6': 6,'7': 7,'8': 8,'9': 9, '.': -1 } def str2float(s): nums = map(lambda ch:CHAR_TO_FLOAT[ch],s) point = 0 def to_float(f,n): nonlocal point if n==-1: point =1 return f if point ==0: return f*10+n else: point =point *10 return f + n/point return reduce(to_float,nums,0)#第三个参数0是初始值,对应to_float中f
filter()
filter()
函数用于过滤序列,filter()
也接受一个函数和一个序列,filter()
把传入的函数依次作用于每个元素,然后根据返回值是True还是False决定保留还是丢弃该元素。
举例说明,删除list中的偶数:
def is_odd(n): return n % 2 == 1 list(filter(is_odd, [1, 2, 4, 5, 6, 9, 10, 15])) # 结果: [1, 5, 9, 15]
小练习:用filter()求素数
计算素数的一个方法是埃氏筛法,它的算法理解起来非常简单:
首先,列出从2开始的所有自然数,构造一个序列:
2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, ...
取序列的第一个数2,它一定是素数,然后用2把序列的2的倍数筛掉:
3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, ...
取新序列的第一个数3,它一定是素数,然后用3把序列的3的倍数筛掉:
5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, ...
取新序列的第一个数5,然后用5把序列的5的倍数筛掉:
7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, ...
不断筛下去,就可以得到所有的素数。
用Python实现这个算法,先构造一个从3开始的期数数列:
def _odd_iter(): n = 1 while True: n = n + 2 yield n #这是一个生成器,并且是一个无线序列
定义一个筛选函数:
def _not_pisible(n): return lambda x: x % n > 0
定义一个生成器不断返回下一个素数:
def primes(): yield 2 it = _odd_iter() # 初始序列 while True: n = next(it) # 返回序列的第一个数 yield n it = filter(_not_pisible(n), it) # 构造新序列
打印100以内素数:
for n in primes(): if n < 100: print(n) else: break
sorted()
python内置的sorted()
函数可以对list进行排序:
>>> sorted([36, 5, -12, 9, -21]) [-21, -12, 5, 9, 36]
sorted()
単純なループを使用すると次のことが実現できます:
>>> sorted([36, 5, -12, 9, -21], key=abs) [5, 9, -12, -21, 36]
map()
を使用: 🎜🎜🎜🎜 >>> sorted(['bob', 'about', 'Zoo', 'Credit'], key=str.lower) ['about', 'bob', 'Credit', 'Zoo']
list()
関数を通じて、シーケンス全体を計算してリストを返すことができます。 🎜🎜🎜このリスト内のすべての数値を文字列に変換したい場合は、map()
を使用するのが簡単です: 🎜🎜🎜🎜>>> sorted(['bob', 'about', 'Zoo', 'Credit'], key=str.lower, reverse=True) ['Zoo', 'Credit', 'bob', 'about']
map( )</code >ユーザーが入力した非標準の英語名を、頭文字を大文字、その他を小文字にした標準的な名前に変更する関数。入力 <code>['adam', 'LISA', 'barT'],
出力 ['Adam', 'Lisa', 'Bart']
🎜🎜🎜🎜L = [('Bob', 75), ('Adam', 92), ('Bart', 66), ('Lisa', 88)] def by_score(t): for i in t: return t[1] L2=sorted(L,key= by_score) print(L2)
reduce()
この関数は 2 つのパラメータも受け取ります。1 つは関数、もう 1 つは反復可能オブジェクトです。reduce は、渡された関数を反復可能オブジェクトの各要素に適用します。結果は累積的に計算されます。その後、最終結果を返します。 🎜🎜🎜効果は次のとおりです: reduce(f, [x1, x2, x3, x4]) = f(f(f(x1, x2), x3), x4)
🎜🎜🎜例、シーケンス [1,2,3,4,5]
を整数に変換します 12345: 🎜🎜🎜🎜L2=sorted(L,key=lambda t:t[1]) print(L2)
prod()
関数を作成します。どちらが受け入れられますか? リストと、reduce を使用して積を計算します: 🎜🎜🎜🎜rrreee🎜map()
および reduce()
総合的な演習: str2float 関数を作成して、文字列 '123.456' を浮動小数点型 123.456 に変換します🎜🎜🎜🎜rrreee🎜🎜🎜filter()🎜🎜🎜🎜filter()
関数はシーケンスをフィルタリングするために使用されます。filter()</ code> は関数とシーケンスも受け入れます。<code>filter()
は渡された関数を各要素に順番に適用し、戻り値が True か False かに基づいて要素を保持するか破棄するかを決定します。 。 🎜🎜🎜たとえば、リスト内の偶数を削除します: 🎜🎜🎜🎜rrreee🎜🎜小さな演習: filter() を使用して素数を見つけます 🎜🎜🎜素数を計算する 1 つの方法はエールリッヒふるい法であり、そのアルゴリズムは次のとおりです。非常に簡単に理解できます: 🎜🎜🎜 まず、2 から始まるすべての自然数をリストし、シーケンスを作成します: 🎜🎜🎜2、3、4、5、6、7、8、9、10、11、12、13、 14, 15, 16 , 17, 18, 19, 20, ...🎜🎜🎜シーケンス内の最初の数値 2 (素数でなければなりません) を取得し、次に 2 を使用してシーケンス内の 2 の倍数を除外します。 : 🎜🎜🎜3、4、5、6、7、8、9、10、11、12、13、14、15、16、17、18、19、20、...🎜🎜🎜最初の数字を取ります新しいシーケンスの 3 は素数である必要があり、その後 3 を使用してシーケンス内の 3 の倍数を除外します: 🎜🎜🎜5、6、7、8、9、10、11、12、13、14 、15、16、17、18、19、20、.. .🎜🎜🎜新しいシーケンスの最初の数値 5 を取得し、5 を使用してシーケンス内の 5 の倍数を除外します: 🎜🎜🎜7, 8 、9、10、11、12、13、14、15、16、17、18、19、20、...🎜🎜🎜連続的にふるいにかけると、すべての素数を得ることができます。 🎜🎜🎜このアルゴリズムを実装するには、まず 3 から始まる周期シーケンスを構築します: 🎜🎜🎜🎜🎜rrreee🎜 フィルタリング関数を定義します: 🎜🎜🎜🎜rrreee🎜 次の素数を継続的に返すジェネレーターを定義します: 🎜🎜 🎜🎜rrreee🎜100 以内の素数を出力します: 🎜🎜🎜🎜rrreee🎜🎜🎜sorted()🎜🎜🎜🎜Python の組み込み sorted()
関数はリストを並べ替えることができます: 🎜🎜🎜🎜rrreee 🎜 sorted()
関数も高階関数であり、カスタム ソートを実装するキー関数を受け入れることもできます: 🎜🎜🎜🎜rrreee🎜 key で指定された関数は、リスト、および key 関数によって返された結果に従って並べ替えます。🎜🎜默认情况下,对字符串排序,是按照ASCII的大小比较的,由于'Z' < 'a',结果,大写字母Z会排在小写字母a的前面。如果想忽略大小写可都转换成小写来比较:
>>> sorted(['bob', 'about', 'Zoo', 'Credit'], key=str.lower) ['about', 'bob', 'Credit', 'Zoo']
要进行反向排序,不必改动key函数,可以传入第三个参数reverse=True
:
>>> sorted(['bob', 'about', 'Zoo', 'Credit'], key=str.lower, reverse=True) ['Zoo', 'Credit', 'bob', 'about']
小练习:假设我们用一组tuple表示学生名字和成绩:L = [('Bob', 75), ('Adam', 92), ('Bart', 66), ('Lisa', 88)]
。用sorted()
对上述列表分别按c成绩从高到低排序:
L = [('Bob', 75), ('Adam', 92), ('Bart', 66), ('Lisa', 88)] def by_score(t): for i in t: return t[1] L2=sorted(L,key= by_score) print(L2)
运用匿名函数更简洁:
L2=sorted(L,key=lambda t:t[1]) print(L2)
以上がPython の一般的な組み込み関数の紹介の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。