paiza開発日誌

IT/Webエンジニア向け総合求人・学習サービス「paiza」(https://paiza.jp ギノ株式会社)の開発者が開発の事、プログラミングネタ、ITエンジニアの転職などについて書いています。

【一覧付き】初心者は意外と知らない?便利な関数たち(Python3版)

f:id:paiza:20170327140723j:plain
Photo by pycon jp
秋山です。

Python3を使って開発中&勉強中の皆さん、組み込み関数はどれくらい覚えていますか?よく使うrange, input, min, max, dict……などしか覚えていないという人も多いかもしれません。

公式ドキュメントを見ると、実に68個もの組み込み関数がありました。(※ちなみに2系→3系で、あまり使われていないものはimportが必要になったり、上位機能のあるものが下位機能と統合されたり、命名変更されたりしています。例えばxrange,rangeは統合、reduceはfunctoolsへ移動…などなど。)

もちろん、あまり使う機会のなさそうな特殊な関数まで覚えておく必要はありません。が、実は案外知られていないけど、使うと結構便利なものもあるのです。

というわけで今回は、意外と知られていないけど、知っていると便利ではかどると思うPython3系の関数を紹介していきます。(※今回はPython3系の関数について説明していきますので、Python2では動かないものもあるかと思います)

■all()

all()は、引数にリストやイテレータを入れた場合に、全てがTrueならTrueを返す……(全ての要素のandをとってくれる)という関数です。

何かしらの配列に対して、全ての要素がある条件を満たしているかどうか知りたい…というときに使えます。

例えばこのように記述すると、リスト内包表記で5以下であればTrueのリストを作ってくれるので、全てきちんと5以下のリストになっているかどうか?といったチェックができます。

if all(i<=5 for i in range(5))

条件の総数が変化する可能性があるから、条件をappendしていって最終的にallしたい……みたいな場合は、他のやり方を考えるよりもシンプルに書けて便利なんじゃないかと思います。

■any()

allの別バージョンみたいな感じで、anyは全ての要素の or をとってくるので、1つでもTrueがあればTrueを返すという処理になります。用途としてはall同等のシチュエーションで場合に合わせて使えるかと。

allとanyはどちらもイテレータの処理が可能となっているので、Python3で増えたイテレータ類を使う機会に便利かと思います。

■enumerate()

リストやイテレータを受け取って、インデックスを付けたイテレータを返してくれます。

例えばこのように書くと

enumerate(["a", "b", "c"]) 

このようなイテレータを返してくれます。

[(0, 'a'), (1, 'b'), (2, 'c')]

Pythonではループが基本的にforeachなので、インデックスが欲しい場合によく使います。

↓こんな感じで書けばいちいちカウンタ変数を用意する必要もないので、コードがシンプルになりますよ。

for i, v in enumerate(["a", "b", "c"]):

■zip()

これは複数のリストやイテレータに対して、同じインデックスをタプルでまとめたイテレータを返してくれます。

例えばこんなリストがあったとして

a = [1,2,3], b = [2, 3, 4]

このように書くと

zip(a, b)

こんな具合に返してくれます。リスト内包表記などに含むと、いろいろできて便利です。

[(1, 2), (2, 3), (3, 4)]

ただ、zipを使うと可読性を下げてしまう場合も多いので、あまり乱用しない方がいいかと思います。

■divmod()

読んで字のごとく、割り算の結果と余りをまとめて求めることができます。

例えば 10÷3 の商と余りを求めたい場合は普通に書くとこんな感じですが

a,b = 10//3, 10%3

divmodを使えばこうなります。

a,b = divmod(10, 3)

あんまり使い道ないかもしれませんが、式を2つ書くよりは少し読みやすくなる……ときもあると思います。

■eval()

evalは他の言語にもあったりするので知っているかもしれませんが、Pythonでも使えますということで。

eval("10+20") とかもできますが、例えばコード内の変数を含めて eval("a+b") といったこともできます。

ただ、他の言語でもよく言われていますがevalを使うのは危険な場合も多いので、慎重に取り扱うようにしましょう……。

■set()

集合を表現する型、setを作ることが出来ます。

こんな感じで使えます。

set([1,2,3]) 

普通のリストでは同じ要素が複数あってもいいのですが、集合では、同じ要素が複数存在することはありません。

set([1,2,3,3]) とした場合も、setの中身は {1,2,3} の3要素となります。

set同士の場合は & でお互いに含まれる要素の set を作ったり、 | で全ての要素をあわて重複を除いたものを作ったり……というような集合演算が可能です。

■Python3の関数ざっくり一覧

ほかにもいろいろな関数がありますので、以下でざっくりジャンル分け&説明してみました。ざっくりすぎて完全に正確ではないところもあるかもしれないので、詳しい解説は公式ドキュメントを参照しながら使ってみてください。

◆型に関するもの(型変換、型への操作など)

  • bool() TrueかFalseに変換する(※変換ルールはこちらに従います)
  • bytearray() バイト配列を返す
  • bytes() バイトオブジェクトを返す
  • dict() 辞書型
  • int() int型
  • float() 浮動小数
  • set() 集合
  • frozenset() 変更不可能なset
  • iter() イテレータを返す
  • list() リストを返す
  • str() 文字列型を返す
  • tuple() タプル型
  • type() 型を返す

数値計算に関するもの

  • abs() 絶対値
  • complex() 複素数に変換する
  • divmod() 商と余りを取得する
  • pow() べき乗(**演算子と同等)
  • max() 最大値を取得
  • min() 最小値を取得
  • bin() 2進数
  • oct() 8進数
  • hex() 16進数
  • round() 四捨五入
  • sum() リストの合計値を返す

◆リスト、イテレータの処理に関するもの

  • all() 全てがTrueならTrueを返す
  • any() どれかがTrueならTrueを返す
  • enumerate() インデックスを付けたイテレータを返す
  • filter() 第一引数に真偽値を返すメソッドやlambda、第二引数にイテレータブルを取り、Trueのイテレータを作る
  • map() 第一引数にメソッドやlambda、第二引数にイテレータブルを取り、第一引数のメソッドやlambdaを通した値のイテレータを作る
  • len() リスト内の要素の数を取得
  • next() イテレータの次を取得
  • range() rangeシーケンスを作る
  • reversed() リストなどを反転させる
  • slice() スライス処理(配列の一部取得など)
  • sorted() リストをソートして返す
  • zip() リストやイテレータから要素を集めたタプルのイテレータを作る

◆文字列に関するもの

  • ascii() 印字可能な表現を含む文字列を返す
  • chr() Unicodeのコードポイントを整数値で指定し、その文字を返す
  • ord() Unicodeのコードポイントの整数値を取得する
  • format() 文字列のフォーマット(今はあまり使われていないかも……)

◆オブジェクトへの操作などに関するもの

  • callable() オブジェクトが呼び出し可能かチェックする
  • classmethod() クラスメソッドの取得
  • staticmethod() 静的メソッドを取得
  • setattr() オブジェクトに属性を設定する
  • getattr() オブジェクトから属性を取得
  • delattr() オブジェクトから属性を削除
  • hasattr() オブジェクトの属性名に存在していればTrueを返す
  • dir() オブジェクトの有効な属性のリストを取得
  • globals() グローバル変数などグローバルシンボルを取得
  • locals() ローカル変数などローカルシンボルを取得
  • hash() オブジェクトのハッシュ値を取得
  • id() オブジェクトの識別値を取得
  • isinstance() 第一引数のオブジェクトが第二引数のインスタンスであるかをチェックする
  • issubclass() 第一引数のクラスが第二引数のサブクラスかチェックする
  • object() 何もないオブジェクトを返す
  • property() property属性を返す(@propertyデコレータなどを利用する方がよい……)
  • repr() オブジェクトを文字列として返す
  • super() 親クラスへのプロキシオブジェクトを返す
  • vars() __dict__属性を持つ場合はそれを返す

コンパイラ機能に関するもの、そのほか特殊な関数

  • compile() そのままですがコンパイルを行う(exec,evalなどで実行可能)
  • eval() 文字列を評価、実行
  • exec() コードの実行(コンパイル済みのオブジェクトやソースもそれぞれ実行可能)
  • help() ヘルプを起動する(対話モジュール上で使う)
  • input() 標準入力より取得
  • print() 標準出力へ出力
  • open() ファイルを開く
  • memoryview() オブジェクトのメモリビューを取得して、メモリの状態などを見れる。(詳細はこちら
  • __import__() import文と同等のことが可能(直接使うことはほぼない……)

■まとめ

既にPython3で開発している人にとっては「今さらこんなの知ってるわ」とか「開発ではこんな関数使いようがないわ」という感じのものもあったかと思いますが、最近勉強を始めたばかりの人には、意外と知らない関数が多かったのではないでしょうか。もっといろいろ詳しく知りたい人は、公式ドキュメントを見てみてください。
What’s New in Python — Python 3.6.1 ドキュメント

また、オンライン実行環境サービス「paiza.IO (パイザ・アイオー)」では、Python2・3はもちろん、ブラウザだけで多数言語のコードを実行することができちゃいます。2系と3系で同じコードを書いた時の動作の違いなどもすぐに確認できますので、気になる人は使ってみてください。
Web-based online coding environment | paiza.IO

過去にもいくつかPythonに関する記事を書いていますので、興味のある方はこちらも読んでみてください。
paiza.hatenablog.com
paiza.hatenablog.com
paiza.hatenablog.com
paiza.hatenablog.com

プログラミング初心者で、まずはPythonを基礎から学びたい!」という方は、プログラミングが動画で学べる「paizaラーニングPython入門編から始めてみると、無理なく基礎を習得できると思います。
paiza.jp

Pythonの講座も公開中!プログラミングが動画で学べるレッスン


paizaは、プログラミング未経験者・初心者向け学習サービス「paizaラーニングを、新サービスとして独立オープンいたしました。

今回記事の中で使用しているPythonの入門講座も好評公開中です。ぜひごらんください!

↓詳しくはこちら
paiza.jp

そして、paizaでは、Webサービス開発企業などで求められるコーディング力や、テストケースを想定する力などが問われるプログラミングスキルチェック問題も提供しています。
paiza.jp
スキルチェックに挑戦した人は、その結果によってS・A・B・C・D・Eの6段階のランクを取得できます。必要なスキルランクを取得すれば、書類選考なしで企業の求人に応募することも可能です。「自分のプログラミングスキルを客観的に知りたい」「スキルを使って転職したい」という方は、ぜひチャレンジしてみてください。

ITプログラマ・エンジニア向け転職・就活・学習サービスのpaiza


プログラミング入門講座|paizaラーニング

PHP入門編Ruby入門編Python入門編Java入門編JavaScript入門編C言語入門編C#入門編アルゴリズム入門編