Python 学习笔记 1 :入门基础(格式、字符串、下划线和转义序列)

help

使用 help 函数可以迅速查找相关函数的文档:

help('len')

可以显示出有关 len 函数的帮助;按下 q键 可以退出帮助。
运行 help() 可以了解关于 help 本身的更多信息。

格式问题

注释

python 可以通过 # 来注释单行代码:

# 注意 print 是一个函数
print('Hello world! ')

标识符命名

  • 第一个字符必须是字母表中的字母(大写 ASCII 字符或者小写 ASCII 字符或者 Unicode 字符)或者下划线(_);
  • 标识符的其他部分可以由字符(大写 ASCII 字符或者小写 ASCII 或者 Unicode 字符)、下划线(_)、数字(0~9)组成;
  • 标识符名称 区分大小写;例如, mynamemyName 不同;
  • 有效的标识字符,如 iname_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)

Pythonformat 方法所做的事情是将每个参数值替换至格式所在的位置。

# 对于浮点数 ‘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?' ,因为多个 ' 的使用,会使字符串的开始和结束出现问题;所以必须指定这个单引号不代表这个字符串的结尾,这时就需要 转义序列

  1. 可以通过反斜杠 \ 来指定单引号: 'What\'s your name?'
  2. 可以通过单引号和双引号的混合使用: "What's your name?"
  3. 同样的,在双引号括起来的字符串中,使用双引号需要使用转义序列;
  4. 可以使用转义序列 \\ 来指定反斜杠本身。

想要指定一串双行字符串:

  1. 使用三引号字符串;
  2. 在单引号或者双引号定义的字符串中,使用 \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 黑魔法指南》

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值