今、話題の人工知能(AI)などで人気のPython。初心者に優しいとか言われていますが、全然優しくない! という事を、つらつら、愚痴っていきます

004.Pythonの変数2

»

初回:2018/08/29

0.今回のまとめ
 Pythonの場合、予約語への代入はできませんが、大文字小文字の違いは区別するので、類似の変数に値の設定は出来てしまいます。
 変数と間違って、組み込み関数のキーワードは、上書きできてしまいます。変な使い方をすると、意味不明なプログラムを書いてしまいますので注意しましょう。

1.予約語
 Pythonでは、予約語(※1)に値を代入することはできません。
>>> True = false
「なにやってるの!」(※2

 しかし、大文字小文字を区別するので、こんなことが可能です。

>>> true = False
>>> if( true ):
... print( "True" )
... else :
... print( "False" )
...
False
>>>

わざと、こんなことはしないと思いますが、予約語によく似た単語を変数に使うことは避けた方が良いでしょう。

2.組み込み関数
 組み込み関数(※3)は、予約語より質(たち)が悪く、変数と間違って
「代入」してしまうと、関数のオーバーライド(上書き)されたことになってしまいます。

>>> def plus( a,b ):
... print( str(a) + str(b) )
...
>>> plus(10,20)
1020
>>> plus('10',20)
1020
>>>
>>> str='ABC'
>>> plus(10,20)
「もう、いい加減にしてよね」(※4

 関数と変数を間違うことも危険ですが、使い方を誤っても気づきにくいこともあります。

>>> list( [1,2,3,4,5] )
[1, 2, 3, 4, 5]
>>> list=[1,2,3,4,5]
>>> list
[1, 2, 3, 4, 5]
>>> list( [1,2,3,4,5] )
「ホント、男ってバカよね。あなたのことよ。」(※5

 変数に関数を代入することもできます。通常は、下記のような使い方ではなく関数の引数に関数を渡すことが多いでしょう。

>>> p=print
>>> p(1,2,3)
1 2 3
>>>

今日は、ここまで(※6

======= <<注釈>>=======

※1 予約語
 予約語は、Pythonのバージョンで異なります。
まずは、バージョンの表示の仕方。

C:\Users\XXXX>python --version
Python 3.7.0

プログラムの中で表示するには、sys.version を使います。

>>> import sys
>>> print(sys.version)
3.7.0 (v3.7.0:1bf9cc5093, Jun 27 2018, 04:59:51) [MSC v.1914 64 bit (AMD64)]
>>>

このバージョンでの予約語一覧を表示します。

>>> __import__('keyword').kwlist
['False', 'None', 'True', 'and', 'as', 'assert', 'async', 'await', 'break', 'class',
'continue', 'def', 'del', 'elif', 'else', 'except', 'finally', 'for', 'from', 'global',
'if', 'import', 'in', 'is', 'lambda', 'nonlocal', 'not', 'or', 'pass', 'raise', 'return',
'try', 'while', 'with', 'yield']
>>>

※2 「なにやってるの!」
>>> True = false
File "<stdin>", line 1
SyntaxError: can't assign to keyword
>>>

※3 組み込み関数
 Pythonの組み込み関数は、dir(__builtins__) で、見ることができます。
 3.7.0 では、154 個の組み込み関数が定義されています。

>>> len(dir(__builtins__))
154
>>>

 これらを変数と間違えて代入すると、関数の上書きと認識されて、おかしな動きをします。

※4 「もう、いい加減にしてよね」
組み込み関数の str を上書きしてしまった。
>>> str='ABC'
>>> plus(10,20)
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "<stdin>", line 2, in plus
TypeError: 'str' object is not callable
>>>

※5 「ホント、男ってバカよね。あなたのことよ。」
>>> list=[1,2,3,4,5]
>>> list
[1, 2, 3, 4, 5]
>>> list( [1,2,3,4,5] )
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: 'list' object is not callable
>>>

※6 今日は、ここまで
 ここまでかい! というツッコミが。
 ただ、3回繰り返したかっただけです。

======= <<参考URL>>=======

https://qiita.com/cm3/items/6a856c44dd92632aa54f
Pythonで変数名をつけるときには予約語だけでなく組み込み関数との衝突も気を付けましょう。

https://coreblog.org/ats/translation-of-why-explicit-self-has-to-stay/
和訳 なぜPythonのメソッド引数に明示的にselfと書くのか

http://jutememo.blogspot.com/2008/09/python_17.html
Python の関数はオブジェクト

Comment(0)

コメント

コメントを投稿する