Python从入门到弃坑学习笔记——第二章 语法基础

第 2 章 语法基础

2.1Python 代码规范

Python 程序的组成

1.Python 程序由模块组成。一个模块对应 Python 源文件,一般后缀名是:.py。

2.模块由语句组成。运行 Python 程序时,按照模块中语句的顺序依次执行。

3.语句是 Python 程序的构造单元,用于创建对象、变量赋值、调用函数、控制语句等。

代码的组织

1.标点符号都是英文/半角符号,而不是中文,例如:(,”

2.Python 区分大小写,例如True不等于true

3. 每行代码结束没必要加 ;

代码的缩进

很多编程语言通过字符(例如:花括号{} )、关键字(例如:begain/end)来划分程序代码块,同时配合代码的缩进增加可读性。而“龟叔”设计Python 语言时,直接通过缩进来划分程序代码块,同一级缩进为一个程序代码块。“缩进”成为Python 语法强制的规定(但这并不是说Python 中没有{} )。

1.每行行首的空白量决定此行的缩进层次,从而用来决定语句的分组。

2.空白量统一用空格、制表符Tab生成,IDE会自动将 单个制表符 设置成 4个空格。

3.通常每个缩进层次使用 单个制表符 或 四个空格。

缩进示例:

def qian():                             #第一级缩进,0个空格

data = a                         #第二级缩进,4个空格

url = b                           #第二级缩进,4个空格,如果不是4个空格会报错,与其他语言的一个明显区别

header = {                     #第二级缩进,4个空格

'cookie': cookie      #第三级缩进,8个空格

}                                    #第二级缩进,4个空格

Python 官方推荐的 PEP-8 代码风格详细说明,有兴趣的可以参考:PEP 8 – Style Guide for Python Code | peps.python.org

注释

1.行注释

每行注释前加#号,最好再加个空格。当解释器看到#,则忽略这一行#后面的内容。

2.段注释

使用三个连续单引号'''(或者三个连续双引号""")。当解释看到''',则会扫描到下一个''',然后忽略他们之间的内容。

换行

一行程序长度是没有限制的,但是为了可读性更强,通常将一行比较长的程序分为多行。我们可以使用\行连接符,把它放在行结束的地方。Python 解释器仍然将它们解释为同一行。

例:long_tuple = ( \

    1, 2, 3, \

    4, 5, 6 \

)

print(long_tuple)

执行后:

(1, 2, 3, 4, 5, 6)

但是,使用\进行硬连接并不是PEP-8推荐的首选方式,因为这可能导致不易察觉的缩进错误和格式混乱。更好的做法是利用Python的()、{}+自动换行功能。

my_tuple = (

    1, 2, 3,

    4, 5, 6

)

print(my_tuple)

my_list = [

    'item1',

    'item2',

    'item3',

]

print(my_list)

my_dict = {

    'key1': 'value1',

    'key2': 'value2',

    'key3': 'value3',

}

执行后:

print(my_dict)

(1, 2, 3, 4, 5, 6)

['item1', 'item2', 'item3']

{'key1': 'value1', 'key2': 'value2', 'key3': 'value3'}

2.2对象

Python 中,一切皆对象。每个对象由:标识(identity)、类型(type)、value(值)组成。

1. 标识用于唯一标识对象,通常对应于对象在计算机内存中的地址。使用内置函数 id(obj) 可返回对象 obj 的标识。

2. 类型用于表示对象存储的“数据”的类型。类型可以限制对象的取值范围以及可执行的操作。可以使用 type(obj)获得对象的所属类型。

3. 值表示对象所存储的数据的信息。使用 print(obj)可以直接打印出值。

对象的本质就是:一个内存块,拥有特定的值,支持特定类型的相关操作。

例1:

a=3 # 动态类型语言不需要定义时声明数据类型

print(id(3))

print(type(3))

print(3)

print(id(a))

print(type(a))

print(a)

执行后:

1531372336

<class 'int'>

3

1531372336

<class 'int'>

3

例2:

b='我爱你' # 或者b="我爱你"也行

print(id(b))

print(type(b))

print(b)

执行后:

46806816

<class 'str'>

我爱你

示意图:

2.3引用

在Python 中,变量也成为:对象的引用。因为变量存储的就是对象的地址。 变量通过地址引用了“对象”。

变量位于:栈内存(压栈出栈等细节,后续再介绍)。

对象位于:堆内存。

Python 是动态类型语言:变量的数据类型不在编译时确定,而在运行时确定,即变量不需要显式声明数据类型。根据变量引用的对象,Python 解释器自动确定其数据类型,这一点不同于C、C++、JAVA。

Python 是强类型语言:每个对象都有数据类型,只支持该类型支持的操作。

2.4关键字、标识符

关键字/保留字

关键字/保留字是Python语言中一些已经被赋予特定意义的单词。开发程序时,不可以把这些保留字作为标识符、变量、函数、类、模块和其他对象的名称来使用。Python 中所有保留字是区分字母大小写的。

and

as

assert

break

class

continue

def

del

elif

else

except

finally

for

from

False

global

if

import

in

is

lambda

nonlocal

not

None

or

pass

raise

return

try

True

while

with

yield

标识符

标识符:用于变量、常量、函数、类、模块等的名称。

标识符命名注意事项

1.区分大小写,如:sxt 和 SXT 是不同的。

2.第一个字符必须是字母、下划线,其后的字符是:字母、数字、下划线,都不能包含空格。

3.不能使用关键字,比如:if、or、while 等。

4.变量名应既简短又具有描述性。

5.慎用字母l和字母O,因为它们可能被人错看成数字1和0。

6.以双下划线开头和结尾的名称通常有特殊含义,尽量避免这种写法。比如:__init__是类的构造函数。

标识符命名规则

开发中,我们通常遵守如下规则:

规则

例子

模块和包库名

全小写字母,尽量简单,多个单词之间使用下划线隔开

math, os, sys

函数名

全小写字母,多个单词之间使用下划线隔开

phone, my_name

类名

采用大驼峰原则:每个单词的首字母大写,其余字母小写

MyPhone 、MyClass 、 Phone

变量名

采用小驼峰原则:只有一个单词时,首字母小写;有多个单词时,第一个单词的首字母小写,其他单词的首字母大写

name、myPhone

常量名

全大写字母,多个单词之间使用下划线隔开

SPEED、MAX_SPEED

2.5变量

概念

一个容器,计算机当中的存储空间,用于在计算机内存中保存数据。

变量的定义

变量定义的格式:

变量名 = 值

变量定义包含的内容:

1.变量的名称(变量命名的注意事项、规则见标识符)

2.变量的数据类型(变量定义时的非显式声明数据类型)

3.变量的值(变量定义时的赋值)

4.变量的地址(在变量定义时的赋值阶段才会在内存中为其对象划分空间,生成变量的地址)

注意事项:

首次定义变量会在内存中为其对象划分空间,并初始化值。

再次使用变量不再划分空间,仅修改其对象原空间中的值(要分可变对象和不可变对象,不可变对象重新分空间)

例:

a = 10 # 定义一个指向整数的变量

b = a # 定义一个指向相同整数的变量

print(a) # 输出:10

print(b) # 输出:10

a = 20 # 尝试“修改”变量a

print(a) # 输出:20

print(b) # 输出:10

分析:

在这个例子中,a 和 b 最初都指向同一个整数对象 10。当我们执行 a= 20 时,我们并没有改变 a 原本指向的整数对象,而是创建了一个新的整数对象 20 并让 a 指向它。因此,b 仍然指向原来的整数对象 10。
同样的概念也适用于字符串和元组等。

变量的删除和垃圾回收机制

可以通过 del 语句删除不再使用的变量。

例:

a = 10

del a

print(a)

执行后:

NameError: name 'a' is not defined

如果对象没有变量引用,就会自动被垃圾回收器回收,清空内存空间(JAVA、Python、JavaScript、GO、Ruby都具有强大的内存回收机制)。

2.6赋值

简单赋值

用于一个对象赋值给一个变量。

例:x=3

链式赋值

用于同一个对象赋值给多个变量。

例:x=y=123

相当于:x=123; y=123

序列解包赋值

序列解包(unpacking)是Python中一个非常实用的功能,它允许将一个序列(如列表、元组、字符串、字典等)中的元素分别赋值给对应个数相同的变量,变量的数据类型可能不再是序列,由赋值后的单个元素数据类型决定。

这种技术在处理函数返回的多个值、交换变量、从序列中读取多个值等情况时非常有用,后面还会再介绍的。

例:a,b,c=4,5,6 # 这是隐式元组,或者显式元组a,b,c= (20,30,10)

相当于:a=4;b=5;c=6

2.7常量

Python 不支持常量,我们只能约定常量的命名规则,以及在程序的逻辑上不对常量的值作出修改,实际是可以修改的。

例:

MAX_SPEED = 120

print(MAX_SPEED)

MAX_SPEED = 140     #实际是可以改的,只能逻辑上不做修改。

print(MAX_SPEED)

执行后:

120

140

2.8运算符

算术运算符

运算符

说明

示例

结果

+

加法

3+2

5

-

减法

30-5

25

*

乘法

3*6

18

/

浮点数除法,结果是一个浮点数

8/2

4.0

//

整数除法,结果是一个被向下取整的整数

7//2

3

%

模(取余)

7%4

3

**

2**3

8

注意:

加、减、乘、除运算符可以重载,例如:

1.加法操作

(1)数字相加:3 + 2==>5

(2)字符串拼接:“3”+“2”==>“32”

(3)列表、元组等合并:[10,20,30]+[5,10,100] ==>[10,20,30,5,10,100]

2.乘法操作

(1)数字相乘:3*2 ==>6

(2)字符串复制:“sxt”*3  ==>”sxtsxtsxt”

(3)列表、元组等复制:[10,20,30]*3 ==>[10,20,30,10,20,30,10,20,30]

比较运算符

所有比较运算符返回 1 表示真,返回 0 表示假,这分别与特殊的变量 True 和 False 等价。

运算符

描述

实例(a=15,b=30)

==

等于  - 比较对象的值是否相等

(a == b) 返回 False。

!=

不等于  - 比较两个对象的值是否不相等

(a != b) 返回 True.

>

大于  - 返回 x 是否大于 y

(a > b) 返回 False。

<

小于  - 返回 x 是否小于 y。

(a < b) 返回 True。

>=

大于等于  - 返回 x 是否大于等于 y。

(a >= b) 返回 False。

<=

小于等于  - 返回 x 是否小于等于 y。

(a <= b) 返回 True。

注意:不同于C、C++,Pythin中比较运算符可以连用,并且含义和我们日常使用完全一致。

例:

a=3

print(1<a<10)

执行后:

True

逻辑运算符

运算符

格式

说明

or逻辑或

x or y

x 为 true,则不计算 y,直接返回 true x 为 false,则返回 y

and逻辑与

x and y

x 为 true,则返回 y 的值

x 为 false,则不计算 y,直接返回 false

not逻辑非

not x

x 为 true,返回 false

x 为 false,返回 true

注意:不同于C、C++的||、&&、!。

同一运算符

同一运算符用于比较两个对象的存储单元,实际比较的是对象的地址。

运算符

格式

描述

is

x is y

判断两个标识符是不是引用同一个对象

is not

x is not y

判断两个标识符是不是引用不同对象

注意:is 与 == 区别

1.is 用于判断两变量引用的对象是否为同一个,即比较两个对象的 id 值是否相等,是否指向同一个内存地址,也可用于判断两变量引用的对象的值是否相等。

2.== 用于判断两变量引用的对象的值是否相等,默认调用对象的__eq__()方法。

3.is 运算符比 == 效率高,在 变量 和 空 进行比较时,应该使用 is。

增强型赋值运算符

运算符+、-、*,/、//、**、%和赋值符=结合可以构成“增强型赋值运算符”。

运算符

例子

等价

+=

a += 2

a = a + 2

-=

a -= 2

a = a-2

*=

a *= 2

a = a * 2

/=

a /= 2

a = a / 2

//=

a //= 2

a = a//2

**=

a **= 2

a = a**2

%=

a %= 2

a = a % 2

注意:“+=”中间不能加空格。

位运算符

运算符

说明

&

按位与

|

按位或

^

按位异或

a<<n

左移,将a的二进制表示算术左移n位,左移一位相当于乘以2的幂

a>>n

右移,将a的二进制表示算术右移n位,右移一位相当于除以2的幂

~

按位翻转

复合赋值运算符

复合赋值可以让程序更加精炼,提高效率。

运算符

描述

示例

等价于

+=

加法赋值

字符串拼接

sum += n         a    +=   “sxt”

sum = sum + n       a    =   a +   “sxt”

- =

减法赋值

num1   - = n

num = num - n

*=

乘法赋值

a *= b

a = a * b

/=

浮点除赋值

a/=b

a = a / b

//=

整数除赋值

a//=b

a = a//b

%=

取余赋值

a%=b

a = a % b

**=

幂运算赋值

a**=2

a = a**2

<<=

左移赋值

a<<=2

a = a<<2

>>=

右移赋值

a>>=2

a = a>>2

&=

按位与赋值

a&=b

a = a&b

| =

按位或赋值

a

=b

a=a

b

^=

按位异或赋值

a^=b

a = a^b

注意:Python和 C、C++、JAVA 不一样,Python 不支持自增(++)和自减(--)。

2.9运算符优先级

如下优先级,从高到低。

运算符

描述

**

指数  (最高优先级)

~

按位翻转

* / % //

乘,除,取模和取整除

+ -

加法减法

>> <<

右移,左移运算符

&

位  'AND'

^

位运算符

<= < > >=

比较运算符

<> == !=

等于运算符

= %= /= //= - = += *= **=

赋值运算符

is is not

身份运算符

in not in

成员运算符

not or and

逻辑运算符

注意:实际使用中,记住简单的规则即可,复杂的表达式一定要使用小括号组织。

1.乘除优先加减

2.位运算和算术运算>比较运算符>赋值运算符>逻辑运算符

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值