4. Pythonの基本構文
PythonはPerl、C、Javaなどの言語と多くの共通点を持っていますが、いくつかの違いもあります。
4.1 最初のPythonプログラム
インタラクティブなプログラミング
インタラクティブなプログラミングでは、スクリプトファイルを作成する必要はありません。Pythonインタプリタの対話モードでコードを直接書くことができます。
Linux上:
Windows上:
スクリプトベースのプログラミング
スクリプトパラメータを使用してインタプリタを起動し、スクリプトの実行を開始します。スクリプトが完了すると、インタプリタは終了します。
[root@bogon test]# cat hello.py
#!/usr/bin/python3
#-*-coding:utf-8 -*-
print("こんにちは、世界!!!")
[root@bogon test]#
[root@bogon test]# python3 hello.py
こんにちは、世界!!!
4.2 識別子
Pythonでは、識別子は文字、数字、およびアンダースコアで構成されます。
Pythonの識別子には英字、数字、およびアンダースコア(_)を使用できますが、数字で始めるのはできません。
Pythonの識別子は大文字と小文字を区別します。
アンダースコアで始まる識別子には特別な意味があります。単一のアンダースコアで始まる識別子(_foo)は、クラス属性にアクセスするためのインターフェースを通じてのみアクセス可能であり、from xxx import * でインポートすることはできません。
二重のアンダースコアで始まる識別子(__foo)は、クラスのプライベートメンバーを表します。二重のアンダースコアで始まり終わります(__foo__)は、Pythonの特殊メソッド用の識別子です。例えば、__init__() はクラスのコンストラクターを表します。
a = "anliu" ; print(a)
anliu
4.3 予約語
以下のリストはPythonの予約語を示しています。これらの予約語は定数や変数名として使用することはできません。
すべてのPythonのキーワードは小文字で構成されています。
4.4 行とインデント
Pythonの他の言語との最大の違いは、クラス、関数、その他の論理判断を制御するために大括弧 {} を使用しないことです。Pythonでは、インデントを使用してコードブロックを記述します。インデントの空白の数は可変ですが、すべてのコードブロックステートメントは同じ数のインデント空白を含む必要があります。
- IndentationError: unindent does not match any outer indentation level エラーは、インデントにタブキーとスペースが混在していることを示します。一致させる必要があります。
- IndentationError: unexpected indent エラーは、タブとスペースが正しく揃っていないことを示します。Pythonはフォーマットに非常に厳格です。
各インデントレベルでは、単一のタブまたは2つのスペースまたは4つのスペースを使用することをお勧めします。混在させることは避けましょう。
4.5 引用符
Pythonでは、シングルクォート(')、ダブルクォート(")、トリプルクォート('''または""")を使用して文字列を表すことができます。引用符の開始と終了は同じタイプでなければなりません。
トリプルクォートは複数行にわたる文字列を表すことができます。これはドキュメンテーション文字列としてよく使用され、ファイル内の特定の場所でコメントとして扱われます。
4.6 コメント
Pythonでは、単行コメントは # で始まります。コメントはステートメントや式の行末に置くことができます。
#!/bin/evn python
#-*- coding:utf-8 -*-
#Author:Anliu
# 最初のコメント
print("Hello, Python!") # 2つ目のコメント
Pythonでは、多行コメントは3つのシングルクォート(''')または3つのダブルクォート(""")を使用します。
#!/bin/evn python
#-*- coding:utf-8 -*-
#Author:Anliu
# 最初のコメント
print("Hello, Python!") # 2つ目のコメント
'''
これは何ですか?
これは何ですか?
'''
4.7 空行
関数間やクラスのメソッド間には空行を入れることで新しいコードブロックの開始を示します。クラスと関数のエントリポイント間にも空行を入れることで、関数の開始を強調します。
空行はPythonの構文の一部ではありませんが、異なる機能や意味を持つコードを分けるために役立ちます。これにより、将来的にコードのメンテナンスや再構築が容易になります。
4.8 ユーザーとの対話
次のプログラムは実行時にユーザーからの入力を待機し、エンターキーを押すと終了します。
#!/bin/evn python
#-*- coding:utf-8 -*-
#Author:Anliu
input("あなたの名前を入力してください:\n")
このコードでは、\n で改行を行います。ユーザーがエンターキーを押すと、他のキーが表示されます。
4.9 出力
print 関数はデフォルトで改行します。改行なしで出力するには、変数の末尾にカンマ , を追加します。
#!/bin/evn python
#-*- coding:utf-8 -*-
#Author:Anliu
x = "a"
y = "b"
print(x)
print(y)
print("_____")
print("the number is a:", x, y)
4.10 モジュール
Pythonのモジュールは、.py 拡張子を持つPythonファイルであり、Pythonオブジェクトの定義とPythonステートメントを含みます。
モジュールを使用することで、Pythonコードを論理的に整理することができます。
関連するコードをモジュールにまとめておくことで、コードが使いやすく、理解しやすくなります。
モジュールは関数、クラス、変数を定義でき、モジュール内に実行可能なコードも含めることができます。
#Author:Anliu
def print_func(par):
print("Hello:", par)
return
4.10.1 import 文
モジュールの導入
モジュールを定義した後、import 文を使用してモジュールを導入できます。以下が構文です:
import module1[, module2[,... moduleN]]
例えば、math モジュールを導入するには、ファイルの最初に import math を記述します。math モジュール内の関数を呼び出すときには、次のように記述します:
モジュール名.関数名
解釈者が import 文に遭遇すると、モジュールが現在の検索パスにある場合に導入されます。
検索パスは、解釈者が最初に検索するディレクトリのリストです。support.py モジュールを導入するには、スクリプトの先頭に以下の命令を記述します:
#Author:Anliu
# モジュールの導入
import support
# 今からモジュール内の関数を呼び出すことができます
support.print_func("Runoob")
モジュールは一度だけ導入され、import を何度実行しても何度も実行されることはありません。これにより、モジュールが繰り返し実行されることを防ぎます。
4.10.2 from...import 文
Python の from 文を使用すると、モジュールから指定された部分を現在の名前空間に導入できます。構文は以下の通りです:
from modname import name1[, name2[, ... nameN]]
例えば、fib モジュールの fibonacci 関数を導入するには、次のように記述します:
from fib import fibonacci
この宣言は、fib モジュール全体を現在の名前空間に導入するわけではなく、fib 内の fibonacci を個別に導入します。
4.10.3 from...import* 文
モジュールのすべての内容を現在の名前空間に導入することも可能です。以下のように記述します:
from modname import *
これは、モジュール内のすべての項目を一度に導入する簡単な方法を提供します。ただし、この宣言はあまり使用すべきではありません。
例えば、math モジュールのすべてのものを一度に導入するには、以下のよう記述します:
from math import *
4.10.4 検索パス
モジュールを導入するとき、Python 解釈者はモジュールの位置を以下の順序で検索します:
- 現在のディレクトリ
- 現在のディレクトリにない場合、shell 変数 PYTHONPATH に含まれる各ディレクトリを検索します。
- どちらも見つからない場合、Python はデフォルトパスを確認します。UNIX では、通常 /usr/local/lib/python/ です。
モジュールの検索パスは system モジュールの sys.path 変数に保存されています。この変数には現在のディレクトリ、PYTHONPATH、およびインストールプロセスによって決定されたデフォルトディレクトリが含まれています。
4.10.5 モジュールの一覧
Pythonの強みは、豊富で強力な標準ライブラリとサードパーティライブラリを持っていることです。ほぼすべての機能に対応するPythonライブラリがあります。
モジュールを読み込むとき、環境パスに基づいてモジュールを検索します。
デフォルトのサードパーティライブラリは E:\\Python3\\Lib\\site-packages にあります。
#Author:Anliu
import sys
print(sys.path)
print(sys.argv)
#Author:Anliu
import os
cmd_res = os.system("dir")
print("----->", cmd_res)
#Author:Anliu
import os
cmd_res = os.popen("dir").read()
print("------->", cmd_res)
モジュールの導入では、まず現在のディレクトリでファイルを検索し、見つからない場合はシステム定義のパスで検索します。
OS モジュールは標準ライブラリで見つけることができますが、sys モジュールは標準ライブラリにはありません。PythonのsysモジュールはPython解釈器に組み込まれています。したがって、モジュールはユーザ定義または標準ライブラリ・サードパーティライブラリだけでなく、Python解釈器自体も提供します。
4.11 .pyc ファイル
.pyc ファイルとは何でしょうか?
Pythonは解釈型言語ですが、実行後、.pyc ファイルが生成されます。例えば:
解釈型言語であれば、.pyc は何のために生成されるのでしょうか?c はcompiledの略です。
4.11.1 解釈型言語とコンパイル型言語
コンピュータは高級言語を直接認識できないため、高級言語でプログラムを実行する際には「翻訳機」が必要です。この過程は2つに分けられます:一つはコンパイル、もう一つは解釈です。
コンパイル型言語はプログラム実行前にコンパイラを使ってプログラムを機械語に変換します。実行時には翻訳が不要で直接実行できます。最も典型的な例はC言語です。
解釈型言語はコンパイルの過程がない代わりに、プログラム実行時にインタープリタがプログラムを解釈し、直接実行します。最も典型的な例はRubyです。
これにより、コンパイル型言語はプログラム実行前に翻訳を行うため、実行時に翻訳の過程が省略され効率が高いです。しかし、一概に言い切ることはできません。一部の解釈型言語は、インタープリタの最適化によってプログラム全体を最適化し、コンパイル型言語よりも効率的に動作することがあります。
さらに、Javaのような仮想機械言語の台頭により、言語を純粋に解釈型とコンパイル型に分けることは難しくなっています。
Javaの例を挙げると、Javaは最初にコンパイラでバイトコードファイルにコンパイルされ、実行時にインタープリタで機械語に解釈されます。つまり、Javaは先にコンパイルし、その後解釈する言語です。
4.11.2 Pythonはいったい何なのか?
実際、PythonはJavaやC#と同じように、仮想機械ベースの言語です。まずは表面的な説明から始めましょう。
コマンドラインで "python hello.py" と入力すると、Pythonのインタープリタが活性化され、作業を開始するよう指示されます。
解釈する前に、最初に行うのはコンパイルです。
Java hello.java
java hello.class
EclipseのようなIDEを使用すると、これらの2つのステップが1つに統合されます。Pythonも同様で、"python hello.py" を実行すると、同じプロセスが行われます。したがって、Pythonは先にコンパイルし、その後解釈する言語と言えます。
4.11.3 Pythonの実行プロセスの簡易説明
この問題を説明する前に、PyCodeObject と pyc ファイルについて説明します。
ハードウェア上で pyc を見るのは明らかですが、実際に PyCodeObject はPythonコンパイラが本当にコンパイルする結果です。
Pythonプログラムが実行されるとき、コンパイル結果はメモリ上の PyCodeObject に保存されます。Pythonプログラムが終了すると、Pythonインタープリタは PyCodeObject を pyc ファイルに書き込みます。
Pythonプログラムが2回目に実行されるとき、最初にハードディスク上で pyc ファイルを探すことがあります。見つかったら直接読み込み、見つからない場合は上記のプロセスを再度行います。
したがって、PyCodeObject と pyc ファイルを定位すると、pyc ファイルは PyCodeObject の永続的な保存方法であると言えます。