iT邦幫忙

第 11 屆 iThome 鐵人賽

DAY 2
0
Software Development

python 自學系列 第 2

python day2 (input、output、variables)

  • 分享至 

  • xImage
  •  

input & output

在之前已經有用 cli 簡單的印出 Hello World 屬於 ouput 結果.print 還可以接收多個不同型態的參數印出結果.

>>> print("Hello",10,'apple',1.2)
Hello 10 apple 1.2

接受 user 的 input 的話,使用的就是 input 這 function,可以選擇是否須要傳入參數,如果有給它參數的話會先印出參數內容,然後等待 user 輸入 input 字串.下面的例子會把 user 的 input 內容透過 = 指定給一個變數.然後再把變數 print 出來.

>>> name = input()
Daniel
>>> print(name)
Daniel
>>> age = input('input your age:')
input your age:32
>>> print(name,age)
Daniel 32

從上面的範例看到變數都沒有宣告是什麼型態,可以使用 type 來看一下,從 input function 接收的都會是字串.

>>> type(name)
<class 'str'>
>>> type(age)
<class 'str'>

所以當要用其他型態的話可以再另外轉,這邊透過 int function 轉型.

>>> type(int(age))
<class 'int'>

所以當要 input 時,就使用 input function,接收是 string.
當要 output 時,就使用 print function.

Variables

透過 = 符號,可以把右邊的物件('daniel')綁定給左邊的變數(name).

name = 'daniel'

當 python 的物件被參照時 reference count 就會加 1,取消參照就會減 1,如果 reference count 變成 0 該物件就會被 garbage collects,從記憶體被釋放.從下面的例子來看一開始建立的變數 getrefcount 的值都會大於 1,因為 name 當作參數傳給 getrefcount 這 function 時也會算 reference count.

>>> name = 'daniel'
>>> import sys
>>> sys.getrefcount(name)
2
>>> name1 = name
>>> sys.getrefcount(name)
3
>>> name2 = name
>>> sys.getrefcount(name)
4
>>> name1 = 'Sam'
>>> sys.getrefcount(name)
3
>>> name2 = 'Jack'
>>> sys.getrefcount(name)
2

在 python 裡幾乎所有的東西都是物件.透過 variables 可以參照到指定的物件來操作該物件.如果沒有宣告變數,只建立一個物件是可行的,但沒有辦法使用該物件.

>>> 'daniel'
'daniel'

所以必須綁定一個變數,再透過變數去操作物件.當綁定變數後只要是物件都可以透過 type function 看物件的型態,id function 看物件的記憶體位址,print function 印出物件的值.

>>> name = 'daniel'
>>> type(name)
<class 'str'>
>>> id(name)
4533431024
>>> print(name)
daniel

str 和 int 也是物件,所以也可以用 type、id、print 看物件的資訊.

>>> type(str)
<class 'type'>
>>> id(str)
4529929568
>>> print(str)
<class 'str'>
>>> type(int)
<class 'type'>
>>> id(int)
4529880208
>>> print(int)
<class 'int'>

在 python 裡宣告變數時不需要指定型別,因為型別都定義在物件裡面.而且變數又可以重新綁定不同物件.所以當物件型態不一樣時,可能會困惑原本是 str 的變數怎麼變成 int 了,所以在寫程式時應該要保持相同變數綁定的是相同型別的物件.

>>> name = 'daniel'
>>> name = 123

Naming variables

在幫變數命名時,要避免使用到 python 的 keywords,像 break 是 key words 在使用時就會出現 SyntaxError 錯誤.

>>> break = 'daniel'
  File "<stdin>", line 1
    break = 'daniel'
          ^
SyntaxError: invalid syntax

可以 import keyword 然後 print keyword.kwlist 來看有哪些 keyword 是在幫變數命名時不能使用的.

>>> import keyword
>>> print(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']

還有一些規則是都是用小寫、使用 _ 來分開不同字、開頭不能是數字、不能覆寫到內建的 function.

>>> name = 'Daniel'
>>> user_age = 20
>>> 1user = 'Ray'
  File "<stdin>", line 1
    1user = 'Ray'
        ^
SyntaxError: invalid syntax

如果使用到了內建 function 的名稱,會導致原來的 function 被覆寫掉了.像下面例子雖然變數名稱可以使用 type,但原本內建的 type function 被覆寫掉,當再次使用時就會出問題.

>>> name = 'Daniel'
>>> type(name)
<class 'str'>
>>> type = 5
>>> type(name)
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: 'int' object is not callable

可以使用dir(__builtins__)來查看該避免哪些字.

>>> dir(__builtins__)
['ArithmeticError', 'AssertionError', 'AttributeError', 'BaseException', 'BlockingIOError', 'BrokenPipeError', 'BufferError', 'BytesWarning', 'ChildProcessError', 'ConnectionAbortedError', 'ConnectionError', 'ConnectionRefusedError', 'ConnectionResetError', 'DeprecationWarning', 'EOFError', 'Ellipsis', 'EnvironmentError', 'Exception', 'False', 'FileExistsError', 'FileNotFoundError', 'FloatingPointError', 'FutureWarning', 'GeneratorExit', 'IOError', 'ImportError', 'ImportWarning', 'IndentationError', 'IndexError', 'InterruptedError', 'IsADirectoryError', 'KeyError', 'KeyboardInterrupt', 'LookupError', 'MemoryError', 'ModuleNotFoundError', 'NameError', 'None', 'NotADirectoryError', 'NotImplemented', 'NotImplementedError', 'OSError', 'OverflowError', 'PendingDeprecationWarning', 'PermissionError', 'ProcessLookupError', 'RecursionError', 'ReferenceError', 'ResourceWarning', 'RuntimeError', 'RuntimeWarning', 'StopAsyncIteration', 'StopIteration', 'SyntaxError', 'SyntaxWarning', 'SystemError', 'SystemExit', 'TabError', 'TimeoutError', 'True', 'TypeError', 'UnboundLocalError', 'UnicodeDecodeError', 'UnicodeEncodeError', 'UnicodeError', 'UnicodeTranslateError', 'UnicodeWarning', 'UserWarning', 'ValueError', 'Warning', 'ZeroDivisionError', '_', '__build_class__', '__debug__', '__doc__', '__import__', '__loader__', '__name__', '__package__', '__spec__', 'abs', 'all', 'any', 'ascii', 'bin', 'bool', 'breakpoint', 'bytearray', 'bytes', 'callable', 'chr', 'classmethod', 'compile', 'complex', 'copyright', 'credits', 'delattr', 'dict', 'dir', 'divmod', 'enumerate', 'eval', 'exec', 'exit', 'filter', 'float', 'format', 'frozenset', 'getattr', 'globals', 'hasattr', 'hash', 'help', 'hex', 'id', 'input', 'int', 'isinstance', 'issubclass', 'iter', 'len', 'license', 'list', 'locals', 'map', 'max', 'memoryview', 'min', 'next', 'object', 'oct', 'open', 'ord', 'pow', 'print', 'property', 'quit', 'range', 'repr', 'reversed', 'round', 'set', 'setattr', 'slice', 'sorted', 'staticmethod', 'str', 'sum', 'super', 'tuple', 'type', 'vars', 'zip']

上一篇
python day1 (Hello Python)
下一篇
python day3 (object)
系列文
python 自學30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

1 則留言

0
山姆大叔
iT邦新手 4 級 ‧ 2019-09-17 15:34:37

這裡有兩種方式查看要避免哪些關鍵字,而且似乎都沒有重複

  • print(keyword.kwlist)
  • dir(builtins)

實際在寫程式的時候是否兩個方式都要檢查並且避免呢?

是的,但兩者應該還是有差異,keyword是具有語法功能的保留字,而 __builtins__是 python 內建好的一些名稱.當使用到 keyword,可能還會有一些 Error 可以提醒

>>> class=123
  File "<stdin>", line 1
    class=123
         ^
SyntaxError: invalid syntax
>>> True=1
  File "<stdin>", line 1
SyntaxError: can't assign to keyword

但如果不小心用到了 python __builtins__ 內建的名稱.會造成不可預期的錯誤.
比如說 ArithmeticError 原本是個 python 定義好的 class

>>> ArithmeticError
<class 'ArithmeticError'>

結果把它當成變數使用,指到 string 物件.

>>> ArithmeticError = 'ArithmeticError'

內建的 ArithmeticError 就靜悄悄的被改成 string 物件了,這時候如果有使用到就會出問題.

>>> ArithmeticError
'ArithmeticError'

如果觀念有錯的話,再麻煩有看到的高手指教了,感謝.

解釋得很清楚,感謝~

我要留言

立即登入留言