python入門(六)——運算符和常用工具

按說應該接着介紹字符串的,不過想到運算符似乎漏掉了,還是先補一下了吧,順便說說一些常用的內置函數。

運算符

關於運算符,最好可以看看operator模塊,你可以import operator,然後help(operator)看看,幫助文件太長我就不貼,不過可以做一些總結,符號之後,我都給出operator模塊給出的官方名稱。

數字的四則運算

  • +,add
  • -,sub
  • *,mul
  • /,truediv

其中,最後一個除法叫做truediv,這個運算符給出除法的準確結果,無論是整數還是小數。相對的,還有一個算符

  • //,floordiv

這個除法給出帶餘除法的結果,最後結果是整數,不管做運算的是整數還是小數,比如

>>> 234 // 10
23
>>> 24.3 // 12
2.0

反正python就是把除法搞成了這兩個,都算載四則運算之內吧。有帶餘除法自然有取模

  • %,mod
>>> 24.3 % 12.1
0.10000000000000142

取模對整數成立自不必說,對於小數也成立,也是很奇葩。(後面的一大串小數就是我前面提到的,實數的表示不可能是精確的,看起來這個精確度也很高了,所以不要太在意,如果你的機器結果和我不同,也不要驚訝,不同的機器實數表示也有可能有誤差。)

  • **,pow。乘方,不用多說
  • -,neg。加在前面,-a表示a的負數
  • +,pos。加在前面,+a就是a,雖然沒有意義,但是數學上應該允許存在

整數運算

前面講整數再計算上的二進制表示的時候說到了,就不一一舉例,僅給出名稱

  • &,and_。位與,由於and是python關鍵字,所以名稱變成了and_
  • |,or_。位或,or也是關鍵字
  • ^,xor。位異或
  • ~,inv或者invert
  • <<,lshift,左位移
  • >>,rshift,右位移

奇葩

  • @matmul

沒想到吧,還有這麼一個運算符,我也是寫本文看看help(operator)才發現的,查了一下,這是PEP465引入的。

正如你所見,名稱matmul翻譯過來就是矩陣乘法。不過目前還沒有任何python的內置類型可以使用這個運算符,不過你可以使用運算符重載(之後會專門講)使得你自定義的類型可以支持這個算符。就我所知,numpy模塊的ndarray是支持的。

上述的所有二元運算符,都可以加上等於號變成運算賦值算符

比如a += b等價於a = a + b,也就是先計算a + b的值然後賦值給a。舉一反三,a **= b, a @= b是什麼意思應該都很不用說了。

字符串的運算符

  • +, concat

就是把兩段字符串接在一起,比如

>>> "hello" + " " + "world"
'hello world'
  • *,這個似乎並沒有專門提出來(沒有像concat一樣另取一個名字),不過對於字符串或者是列表都是可以的,比如
>>> '12' * 5
'1212121212'
>>> [2, 3] * 3
[2, 3, 2, 3, 2, 3]

邏輯運算符

  • ==,eq。等於
  • !=,neq。不等於
  • >,gt。大於
  • <,lt。小於
  • >=,ge。大於等於
  • <=,le。小於等於
  • not,not_。邏輯非

和位非不一樣,邏輯上的非作用域邏輯變量,把True變成False,把False變成True,僅此而已。

其他

  • del,delitem

del嚴格來說算是關鍵字吧,不過其意義是刪除某個變量,比如

>>> a = 100
>>> del a
>>> a
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
NameError: name 'a' is not defined

它也可以用來刪除列表中的某一個元素

>>> a = [1, 2, 3]
>>> del a[1]
>>> a
[1, 3]
  • in,containsb in a表示operator.contains(a, b)

in也是一個關鍵字,b in a返回一個邏輯變量,如果單元b在列表或元組a中,或者字符串b在字符串a中就返回True,否則爲False

  • setitem,這是一個函數,operator.setitem(a, b, c)等價於
    a[b] = c,也就是給列表a的索引值爲b的量賦值爲c

  • index,這是爲了索引準備的operator.index(a)等價於a.__index__()。而__index__()函數只有能夠作爲索引的類型才能夠定義,這是爲了防止傳給索引的值是小數或者其他類型。對初學者並不重要,具體看PEP357

  • abs,operator模塊還把這個函數寫進來了,就是求絕對值,這個是內置函數,不用到math模塊裏面去找。並且這個內置的abs函數也支持複數求絕對值(長度)。

內置工具

  • print(),輸出函數

初學者,要想在運行腳本的時候看到輸出,就是和這個函數打交道了,print函數是變長參數的,可以指定分隔符,結束符等,具體看help(print)

  • input(),輸入函數

有輸出,當然要有輸入,輸入的作用是在程序運行的時候,輸入一些未定的參數。

>>> s = input()
你好
>>> s
'你好'

注意,上面第二行那個你好是我自己輸入的,你也可以輸入別的東西。input()獲取的變量是字符串,就算你輸入的全部是數字,得到的變量類型也是字符串,不過你可以使用類型轉換變成數字

>>> s = input()
1234567
>>> s
'1234567'
>>> type(s)
<class 'str'>
>>> int(s)
1234567

input()還可以指定一個參數作爲輸入前的提示,比如

>>> s = input("請輸入你的名字:")
請輸入你的名字:Alice

前面的請輸入你的名字:這些是已經打印出來的,我只需要輸入Alice就好了。

  • type()和類型轉換

type()作用是顯示變量的類型,我們已經說過,每一個變量都有類型,函數也是有類型的。

>>> type(1)
<class 'int'>
>>> type(print)
<class 'builtin_function_or_method'>
>>> type(type)
type

其實type不是一個函數,而是一個類函數的類型,你可以help(type)看看,不過當作函數也沒關係。

而類型之間有可能可以相互轉換,但是也可能不行,比如intfloat之間自然是可以轉換的,字符"12.3"可以轉化爲數字,但是"hello"自然就不可以轉化。類型轉化,直接使用類型名作爲函數就好了,只是轉換不了就會報錯。

>>> complex('1+3j')
(1+3j)
>>> str(2**10)
'1024'
>>> int('12.3')
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
ValueError: invalid literal for int() with base 10: '12.3'
  • dir()函數
>>> import operator
>>> dir(operator)
['__abs__', '__add__', '__all__', '__and__', '__builtins__', '__cached__', '__concat__', '__contains__', '__delitem__', '__doc__', '__eq__', '__file__', '__floordiv__', '__ge__', '__getitem__', '__gt__', '__iadd__', '__iand__', '__iconcat__', '__ifloordiv__', '__ilshift__', '__imatmul__', '__imod__', '__imul__', '__index__', '__inv__', '__invert__', '__ior__', '__ipow__', '__irshift__', '__isub__', '__itruediv__', '__ixor__', '__le__', '__loader__', '__lshift__', '__lt__', '__matmul__', '__mod__', '__mul__', '__name__', '__ne__', '__neg__', '__not__', '__or__', '__package__', '__pos__', '__pow__', '__rshift__', '__setitem__', '__spec__', '__sub__', '__truediv__', '__xor__', '_abs', 'abs', 'add', 'and_', 'attrgetter', 'concat', 'contains', 'countOf', 'delitem', 'eq', 'floordiv', 'ge', 'getitem', 'gt', 'iadd', 'iand', 'iconcat', 'ifloordiv', 'ilshift', 'imatmul', 'imod', 'imul', 'index', 'indexOf', 'inv', 'invert', 'ior', 'ipow', 'irshift', 'is_', 'is_not', 'isub', 'itemgetter', 'itruediv', 'ixor', 'le', 'length_hint', 'lshift', 'lt', 'matmul', 'methodcaller', 'mod', 'mul', 'ne', 'neg', 'not_', 'or_', 'pos', 'pow', 'rshift', 'setitem', 'sub', 'truediv', 'truth', 'xor']
>>> dir(int)
['__abs__', '__add__', '__and__', '__bool__', '__ceil__', '__class__', '__delattr__', '__dir__', '__divmod__', '__doc__', '__eq__', '__float__', '__floor__', '__floordiv__', '__format__', '__ge__', '__getattribute__', '__getnewargs__', '__gt__', '__hash__', '__index__', '__init__', '__init_subclass__', '__int__', '__invert__', '__le__', '__lshift__', '__lt__', '__mod__', '__mul__', '__ne__', '__neg__', '__new__', '__or__', '__pos__', '__pow__', '__radd__', '__rand__', '__rdivmod__', '__reduce__', '__reduce_ex__', '__repr__', '__rfloordiv__', '__rlshift__', '__rmod__', '__rmul__', '__ror__', '__round__', '__rpow__', '__rrshift__', '__rshift__', '__rsub__', '__rtruediv__', '__rxor__', '__setattr__', '__sizeof__', '__str__', '__sub__', '__subclasshook__', '__truediv__', '__trunc__', '__xor__', 'bit_length', 'conjugate', 'denominator', 'from_bytes', 'imag', 'numerator', 'real', 'to_bytes']
>>> dir(print)
['__call__', '__class__', '__delattr__', '__dir__', '__doc__', '__eq__', '__format__', '__ge__', '__getattribute__', '__gt__', '__hash__', '__init__', '__init_subclass__', '__le__', '__lt__', '__module__', '__name__', '__ne__', '__new__', '__qualname__', '__reduce__', '__reduce_ex__', '__repr__', '__self__', '__setattr__', '__sizeof__', '__str__', '__subclasshook__', '__text_signature__']

dir()函數可以查看某個變量的所有屬性,這些屬性有可能是變量,有可能是函數。對於一個陌生的模塊或者類型,你可以在交互式下先dir一下看看,會有不少的發現,help是一個詳細的介紹,dir可以看作是一種摘要,比較簡略,但是也可以看出很多信息。

  • help()

help()也不是函數,用help(help)看看吧。順帶一提,help(something)太長,可以按q結束。
對於一般的變量,直接help(something)help('something')是一樣的,不過help也可以用來查看關鍵字的用法,這個時候就必須用字符串而不是變量名了比如help('if')

  • import this
    在交互式環境下,輸入import this會自動打印一首小詩,這叫做python之禪,如果你看英文有點吃力,可以百度一下翻譯,這首小詩表明了python的設計思想和風格。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章