按说应该接着介绍字符串的,不过想到运算符似乎漏掉了,还是先补一下了吧,顺便说说一些常用的内置函数。
关于运算符,最好可以看看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 "" , line 1, in <module>
NameError: name 'a' is not defined
它也可以用来删除列表中的某一个元素
>>> a = [1, 2, 3]
>>> del a[1]
>>> a
[1, 3]
in
,contains
。b 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)
看看,不过当作函数也没关系。
而类型之间有可能可以相互转换,但是也可能不行,比如int
和float
之间自然是可以转换的,字符"12.3"
可以转化为数字,但是"hello"
自然就不可以转化。类型转化,直接使用类型名作为函数就好了,只是转换不了就会报错。
>>> complex('1+3j')
(1+3j)
>>> str(2**10)
'1024'
>>> int('12.3')
Traceback (most recent call last):
File "" , 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的设计思想和风格。