文章目录
help
使用 help
函数可以迅速查找相关函数的文档:
help('len')
可以显示出有关 len
函数的帮助;按下 q键
可以退出帮助。
运行 help()
可以了解关于 help
本身的更多信息。
格式问题
注释
python 可以通过 #
来注释单行代码:
# 注意 print 是一个函数
print('Hello world! ')
标识符命名
- 第一个字符必须是字母表中的字母(大写 ASCII 字符或者小写 ASCII 字符或者 Unicode 字符)或者下划线(
_
); - 标识符的其他部分可以由字符(大写 ASCII 字符或者小写 ASCII 或者 Unicode 字符)、下划线(
_
)、数字(0~9)组成; - 标识符名称 区分大小写;例如,
myname
与myName
不同; - 有效的标识字符,如
i
、name_2_3
。
逻辑行与物理行
所谓物理行(Physical Line)是编写程序时,自己看到的内容;所谓逻辑行(Logical Line)是 Python 所看到的单个语句。
Python 会假定每一个物理行会对应一个逻辑行;
例如,print('hello world ')
这样一句语句——如果其本身是一行,那么它也对应着一行物理行。
Python之中暗含这样一种期望:Python 鼓励每一行使用一句独立语句,从而使得代码更加可读;
如果希望在一行物理行中指定多行逻辑行,那么必须通过使用分号 (;
)来明确表明逻辑行或语句的结束。
i = 5
print(i)
# 等同于
i = 5;
print(i);
# 等同于
i = 5; print(i);
# 等同于
i = 5; print(i)
但是,强烈建议,对于每一行物理行最多只写入一行逻辑行,即尽量不使用分号!
书上这么建议,不过这么写确实美观!!!
显式行连接(Explicit Line Joining):
对于一行非常长的代码,可以通过使用反斜杠 \
将其拆分为多个物理行。
s = 'This is a string. \
This continues the string.'
print(s)
# 输出:
# This is a string. This continues the string.
隐式行连接(Implicit Line Joining):
在某些情况下,会存在一个隐含的假设,允许不使用反斜杠;这一情况,即逻辑行以括号开始,它可以是方括号 [
或者花括号 {
,但是不可以是右括号。
缩进(Indentation)
空白区在 Python 中十分重要,空白区在各行的开头,称为缩进。
在逻辑行的开头留下空白区(使用空格或者制表符)用以确定各逻辑行的缩进级别,而后者又可以用于确定语句的分组。这意味着放置在一起的语句必须拥有相同的缩进。每一组这样的语句被称为块(block)。
错误的缩进可能会导致错误,即 IndentationError:unexpected indent
。
下划线
单个下划线 _
在解释器中,_
符号指交互解释器中最后一次执行语句的返回结果
>>> _
Traceback (most recent call last):
File "", line 1, in
NameError: name '_' is not defined
>>> 42
>>> _
42
>>> 'alright!' if _ else ':('
'alright!'
>>> _
'alright!'
_
作为一个名称使用,应该被丢弃的用法,不推荐:
n = 42
for _ in range(n):
do_something()
_
作为名称的前缀,例如 _name
,指定了这个名称是私有的。如果你这么写 from <module/package> import *
,任何以单下划线开头的名称都不会被导入,除非模块/包的 __all__
列表明确包含了这些名称。
两个下划线 __
双下划线前缀的名称(例如 __shahriar
):
以双下划线做前缀的名称(特别是方法名)并不是一种惯例;它对解释器有特定含义。Python会改写这些名称,以免与子类中定义的名称产生冲突。Python documentation中提到,任何 __spam
这种形式(至少以两个下划线做开头,绝大部分都还有一个下划线做结尾)的标识符,都会文本上被替换为 _classname__spam
,其中 classname
是当前类名,并带上一个下划线做前缀。
>>> class A(object):
... def _internal_use(self):
... pass
... def __method_name(self):
... pass
...
>>> dir(A())
['_A__method_name', ..., '_internal_use']
正如所料,_internal_use
没有变化,但 __method_name
被改写成了 _ClassName__method_name
。现在创建一个 A
的子类 B
(这可不是个好名字),就不会轻易的覆盖掉 A
中的 __method_name
了:
>>> class B(A):
... def __method_name(self):
... pass
...
>>> dir(B())
['_A__method_name', '_B__method_name', ..., '_internal_use']
前后都带有双下划线的名称(例如 __init__
):
这些是Python的特殊方法名,这仅仅是一种惯例,一种确保Python系统中的名称不会跟用户自定义的名称发生冲突的方式。通常你可以覆写这些方法,在Python调用它们时,产生你想得到的行为。例如,当写一个类的时候经常会覆写 __init__
方法。
你也可以写出自己的“特殊方法”名(但是别这么做):
>>> class C(object):
... def __mine__(self):
... pass
...
>>> dir(C)
... [..., '__mine__', ...]
数字
分为两个类型——整数(integers)与浮点数(floats)
字符串
- 使用单引号来指定字符串;
‘Quote me on this, or this“ haha’
- 使用双引号来指定字符串,效果与单引号是一样的;
“像这样,还有可以使用‘ ”
- 使用三引号来指定多行字符串,在三引号之间,可以使用单引号和双引号
'''
This is the first line
"What's your name?", I asked
He said,"Bond, James Bond"
'''
效果
This is the first line
"What's your name?", I asked
He said,"Bond, James Bond"
字符串格式方法
age = 20
name = 'Swaroop'
print('{0} was {1} years old when he wrote this book'.format(name, age))
print('Why is {0} playing with that python?'.format(name))
or
age = 20
name = 'Swaroop'
print('{} was {} years old when he wrote this book'.format(name, age))
print('Why is {} playing with that python?'.format(name))
输出:
Swaroop was 20 years old when he wrote this book
Why is Swaroop playing with that python?
or
age = 20
name = 'Swaroop'
name + 'was' + str(age) + 'years old when he wrote this book'
输出
'Swaroopwas20years old when he wrote this book'
注意:
format
的数字只是一个可选选项。
Python 从 0 开始计数,即索引中的第一位是 0, 第二位是 1,以此类推。
通过联立字符串可以达到 format
相同的效果,但是代码相对丑陋易出错;且需要手动转换至字符串——str(age)
。
Python 中 format
方法所做的事情是将每个参数值替换至格式所在的位置。
# 对于浮点数 ‘0.333’ 保留小数点(.)后三位
print('{0:.3f}'.format(1.0/3))
# 使用下划线填充文本,并保持文字处于中间位置
# 使用 (^) 定义 '___hello___' 字符串长度为 11
print('{0:_^11}'.format('hello'))
# 基于关键字输出 Swaroop wrote A byte of Python
print('{name} wrote {book}'.format(name = 'Swaroop', book = 'A byte of Python'))
输出
0.333
___hello___
Swaroop wrote A byte of Python
注意:
print
总是会以一个不可见的 “新一行” 字符(\n
)结尾,因此重复调用 print
将会在相互独立的一行中分别打印;为了避免打印过程中出现换行符,可以通过 end
指定其应以空白结尾 或者 空格结尾。
print('a')
print('b')
print('1*********空白结尾')
# 空白结尾
print('a', end='')
print('b', end='')
print('c')
print('2*********空格结尾')
# 空格结尾
print('a', end=' ')
print('b', end=' ')
print('c')
输出
a
b
1*********空白结尾
abc
2*********空格结尾
a b c
转义序列(Escape Sequence)
实现 'What's your name?'
的方式,在 Python 代码中,不可以直接使用 'What's your name?'
,因为多个 '
的使用,会使字符串的开始和结束出现问题;所以必须指定这个单引号不代表这个字符串的结尾,这时就需要 转义序列。
- 可以通过反斜杠
\
来指定单引号:'What\'s your name?'
; - 可以通过单引号和双引号的混合使用:
"What's your name?"
; - 同样的,在双引号括起来的字符串中,使用双引号需要使用转义序列;
- 可以使用转义序列
\\
来指定反斜杠本身。
想要指定一串双行字符串:
- 使用三引号字符串;
- 在单引号或者双引号定义的字符串中,使用
\n
来表示新一行的开始。
'This is the first line\nThis the second line'
在一个字符串中,一个放置在末尾的反斜杠表示字符串将在下一行继续,但不会添加新的一行:
"This is the first sentence. \
This is the second sentence. "
# 相当于
"This is the first sentence. This is the second sentence. "
原始字符串
如果需要指定一些未经过特殊处理的字符串,比如转义序列,那么需要在字符串前增加 r
或者 R
来指定一个原始字符串
r"Newlines are indicated by \n"
在处理正则表达式时,应该全程使用原始字符串
参考
《简明 Python 教程》
《Python 黑魔法指南》