Python成长笔记 - 基础篇 (二)python基本语法

Python的设计目标之一是让代码具备高度的可阅读性。它设计时尽量使用其它语言经常使用的标点符号和英文单字,让代码看起来整洁美观。它不像其他的静态语言如C、Pascal那样需要重复书写声明语句,也不像它们的语法那样经常有特殊情况和惊喜。

Python缩进

Python开发者有意让违反了缩进规则的程序不能通过编译,以此来强制程序员养成良好的编程习惯。并且Python语言利用缩进表示语句块的开始和退出(Off-side规则),而非使用花括号或者某种关键字。增加缩进表示语句块的开始,而减少缩进则表示语句块的退出。缩进成为了语法的一部分。例如if语句:

?


1

2

3

4

if age<21:

print("你不能买酒。")

print("不过你能买口香糖。")

print("这句话处於if语句块的外面。")

注:上述例子为python 3.0版本的代码

根据PEP的规定,必须使用4个空格来表示每级缩进(不清楚4个空格的规定如何,在实际编写中可以自定义空格数,但是要满足每级缩进间空格数相等)。使用Tab字符和其它数目的空格虽然都可以编译通过,但不符合编码规范。支持Tab字符和其它数目的空格仅仅是为兼容很旧的的Python程序和某些有问题的编辑程序。

Python控制语句

if语句,当条件成立时运行语句块。经常与else, elif(相当于else if) 配合使用。

for语句,遍历列表、字符串、字典、集合等迭代器,依次处理迭代器中的每个元素。

while语句,当条件为真时,循环运行语句块。

try语句。与except,finally配合使用处理在程序运行中出现的异常情况。

class语句。用于定义类型

def语句。用于定义函数和类型的方法。

pass语句。表示此行为空,不运行任何操作。

assert语句。用于程序调试阶段时测试运行条件是否满足。

with语句。Python2.6以后定义的语法,在一个场景中运行语句块。比如,运行语句块前加密,然后在语句块运行退出后解密。

yield语句。在迭代器函数内使用,用于返回一个元素。自从Python 2.5版本以后。这个语句变成一个运算符。

raise语句。制造一个错误。

import语句。导入一个模块或包。

from import语句。从包导入模块或从模块导入某个对象。

import as语句。将导入的对象赋值给一个变量。

in语句。判断一个对象是否在一个字符串/列表/元组里。

Python表达式

Python的表达式写法与C/C++类似。只是在某些写法有所差别。

主要的算术运算符与C/C++类似。+, -, *, /, //, **, ~, %分别表示加法或者取正、减法或者取负、乘法、除法、整除、乘方、取补、取模。>>, <<表示右移和左移。&, |, ^表示二进制的AND, OR, XOR运算。>, <, ==, !=, <=, >=用于比较两个表达式的值,分别表示大于、小于、等于、不等于、小于等于、大于等于。在这些运算符里面,~, |, ^, &, <<, >>必须应用于整数。

Python使用and, or, not表示逻辑运算。

is, is not用于比较两个变量是否是同一个对象。in, not in用于判断一个对象是否属于另外一个对象。

Python支持“列表推导式”(list comprehension),比如计算0-9的平方和:

>>> sum(x * x for x in range(10))

285

Python使用lambda表示匿名函数。匿名函数体只能是表达式。比如:

>>> add=lambda x, y : x + y

>>> add(3,2)

5

Python使用y if cond else x表示条件表达式。意思是当cond为真时,表达式的值为y,否则表达式的值为x。相当于C++和Java里的cond?y:x。

Python区分列表(list)和元组(tuple)两种类型。list的写法是[1,2,3],而tuple的写法是(1,2,3)。可以改变list中的元素,而不能改变tuple。在某些情况下,tuple的括号可以省略。tuple对于赋值语句有特殊的处理。因此,可以同时赋值给多个变量,比如:

>>> x, y=1,2#同时给x,y赋值,最终结果:x=1, y=2

特别地,可以使用以下这种形式来交换两个变量的值:

>>> x, y=y, x #最终结果:y=1, x=2

Python使用‘(单引号)和"(双引号)来表示字符串。与Perl、Unix Shell语言或者Ruby、Groovy等语言不一样,两种符号作用相同。一般地,如果字符串中出现了双引号,就使用单引号来表示字符串;反之则使用双引号。如果都没有出现,就依个人喜好选择。出现在字符串中的\(反斜杠)被解释为特殊字符,比如\n表示换行符。表达式前加r指示Python不解释字符串中出现的\。这种写法通常用于编写正则表达式或者Windows文件路径。

Python支持列表切割(list slices),可以取得完整列表的一部分。支持切割操作的类型有str, bytes, list, tuple等。它的语法是...[left:right]或者...[left:right:stride]。假定nums变量的值是[1, 3, 5, 7, 8, 13, 20],那么下面几个语句为真:

nums[2:5] == [5, 7, 8] 从下标为2的元素切割到下标为5的元素,但不包含下标为5的元素。

nums[1:] == [3, 5, 7, 8, 13, 20] 切割到最后一个元素。

nums[:-3] == [1, 3, 5, 7] 从最开始的元素一直切割到倒数第3个元素。

nums[:] == [1, 3, 5, 7, 8, 13, 20] 返回所有元素。改变新的列表不会影响到nums。

nums[1:5:2] == [3, 7] 从下标为1的元素切割到下标为5的元素但不包含下标为5的元素,且步长为2。

Python函数

Python的函数支持递归、默认参数值、可变参数,但不支持函数重载。为了增强代码的可读性,可以在函数后书写“文档字符串”(Documentation Strings,或者简称docstrings),用于解释函数的作用、参数的类型与意义、返回值类型与取值范围等。可以使用内置函数help()打印出函数的使用帮助。比如:

>>> def randint(a, b):

... "Return random integer in range [a, b], including both end points."...

>>> help(randint)

Help on function randint in module __main__:

randint(a, b)

Return random integer inrange[a, b], including both end points.

Python对象的方法

对象的方法是指绑定到对象的函数。调用对象方法的语法是instance.method(arguments)。它等价于调用Class.method(instance, arguments)。当定义对象方法时,必须显式地定义第一个参数,一般该参数名都使用self,用于访问对象的内部数据。这里的self相当于C++, Java里面的this变量,但是我们还可以使用任何其它合法的参数名,比如this 和 mine 等,self与C++,Java里面的this不完全一样,它可以被看作是一个习惯性的用法,我们传入任何其它的合法名称都行,比如:

?


1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

class Fish:

def eat(self,food):

if food is not None:

self.hungry=False

class User:

def__init__(myself,name):

myself.name=name

#构造Fish的实例:

f=Fish()

#以下两种调用形式是等价的:

Fish.eat(f,"earthworm")

f.eat("earthworm")

u=User(‘username‘)

print(u.name)

Python认识一些以“__”开始并以“__”结束的特殊方法名,它们用于实现运算符重载和实现多种特殊功能。

Python类型

Python采用动态类型系统。在编译的时候,Python不会检查对象是否拥有被调用的方法或者属性,而是直至运行时,才做出检查。所以操作对象时可能会抛出异常。不过,虽然Python采用动态类型系统,它同时也是强类型的。Python禁止没有明确定义的操作,比如数字加字符串。

与其它面向对象语言一样,Python允许程序员定义类型。构造一个对象只需要像函数一样调用类型即可,比如,对于前面定义的Fish类型,使用Fish()。类型本身也是特殊类型type的对象(type类型本身也是type对象),这种特殊的设计允许对类型进行反射编程。

Python内置丰富的数据类型。与Java、C++相比,这些数据类型有效地减少代码的长度。下面这个列表简要地描述了Python内置数据类型(适用于Python 3.x):


类型

描述

例子
备注

str

一个由字符组成的不可更改的有串行。

‘Wikipedia‘

"Wikipedia"

"""Spanning

multiple

lines"""

在Python 3.x里,字符串由Unicode字符组成

bytes

一个由字节组成的不可更改的有串行。

b‘Some ASCII‘

b"Some ASCII"

 

list

可以包含多种类型的可改变的有串行

[4.0, ‘string‘, True]
 

tuple

可以包含多种类型的不可改变的有串行

(4.0, ‘string‘, True)
 

set, frozenset

与数学中集合的概念类似。无序的、每个元素唯一。

{4.0, ‘string‘, True}

frozenset([4.0, ‘string‘, True])

 

dict

一个可改变的由键值对组成的无串行。

{‘key1‘: 1.0, 3: False}
 

int

精度不限的整数

42
 

float

浮点数。精度与系统相关。

3.1415927
 

complex

复数

3+2.7j
 

bool

逻辑值。只有两个值:真、假

True

False

 

除了各种数据类型,Python语言还用类型来表示函数、模块、类型本身、对象的方法、编译后的Python代码、运行时信息等等。因此,Python具备很强的动态性。

Python数学运算

Python使用与C、Java类似的运算符,支持整数与浮点数的数学运算。同时还支持复数运算与无穷位数(实际受限于计算机的能力)的整数运算。除了求绝对值函数abs()外,大多数数学函数处于math和cmath模块内。前者用于实数运算,而后者用于复数运算。使用时需要先导入它们,比如:

>>> import math

>>> print(math.sin(math.pi/2))

1.0

fractions模块用于支持分数运算;decimal模块用于支持高精度的浮点数运算。

Python定义求余运行a % b的值处于开区间[0, b)内,如果b是负数,开区间变为(b, 0]。这是一个很常见的定义方式。不过其实它依赖于整除的定义。为了让方程式:b * (a // b) + a % b = a恒真,整除运行需要向负无穷小方向取值。比如7 // 3的结果是2,而(-7) // 3的结果却是-3。这个算法与其它很多编程语言不一样,需要注意,它们的整除运算会向0的方向取值。

Python允许像数学的常用写法那样连着写两个比较运行符。比如a < b < c与a < b and b < c等价。C++的结果与Python不一样,首先它会先计算a < b,根据两者的大小获得0或者1两个值之一,然后再与c进行比较。

时间: 2024-10-12 04:26:04

Python成长笔记 - 基础篇 (二)python基本语法的相关文章

Python成长笔记 - 基础篇 (十二)----RabbitMQ、Redis 、线程queue

本节内容: 1.RabbitMQ 消息队列 2.Redis 3.Mysql PY 中的线程queue(threading Queue):用于多个线程之间进行数据交换,不能在进程间进行通信 进程queue:父进程与子进程中的交互,或者是同属于同一个父进程下多个子进程进行交互:两个不相关的进程间交互不能用进程queue RabbitMQ --信息流是单向的 两个完全独立的程序进行交互:1.进程间建立socket 2.一个写入disk,另一个调用 3.使用中间进程,RabbitMQ等 Remote p

Python成长笔记 - 基础篇 (十一)

回顾: 线程:资源的集合:内存共享,两个或多个线程同时修改一份数据时,造成结果可能不正确,必须加锁 进程:运行的最小单元 守护进程:在start之前设置setDemo() 队列queue:作用解耦,使程序之间是实现松耦合,提高处理效率 FIFO:先进先出 LIFO:后进先出 队列中的数据使用完就没了(消费者生产者模型) 事件event:(红绿灯模型) python中的多线程是一个假象,我们是利用它上下文切换 io操作不占用CPU,计算操作占用CPU, python中大量的计算反而会使程序变得更慢

Python成长笔记 - 基础篇 (十)

本节内容 进程.与线程区别 python GIL全局解释器锁 线程 语法 join 线程锁之Lock\Rlock\信号量 将线程变为守护进程 Event事件 queue队列 生产者消费者模型 Queue队列 开发一个线程池 进程 语法 进程间通讯 进程池 ssh ssh_sftp SSH密钥 RSH -非对称密钥验证 公钥:public key 私钥: privat key 10.0.0.31 ----连接----> 10.0.0.41 私钥 公钥 10.0.0.31 生成密钥对ssh-keyg

Python成长笔记 - 基础篇 (七)python面向对象

三大特性: 1.封装:在类中对数据赋值.内部调用对外部用户是透明的,这使类变成了一个胶囊或容器,里面包含着类的数据和方法 2.继承:一个类可以派生出子类,在父类中定义的属性.方法会自动被子类继承 # class People:#经典类 class People(object):#新式类 def __init__(self,,age): self.name = self.age = age def eat(self): print('%s is eating' %self.name) def wo

Python成长笔记 - 基础篇 (三)python列表元组、字典、集合

本节内容 列表.元组操作 字符串操作 字典操作 集合操作 文件操作 字符编码与转码   一.列表和元组的操作 列表是我们最以后最常用的数据类型之一,通过列表可以对数据实现最方便的存储.修改等操作 定义列表 names = ["Wang","HouZi1","NiuNiu","ZhouYi","HouZi2",[1,2]] 可以通过列表角标的方式去获得list中的值 print(names)print(nam

Python成长笔记 - 基础篇 (四)函数

1.面向对象:类(class) 2.面向过程:过程(def) 3.函数式编程:函数(def)----python 1.函数:http://egon09.blog.51cto.com/9161406/1834777 编程语言中函数定义:函数是逻辑结构化和过程化的一种编程方法. 12345678910111213 python中函数定义方法: def test(x): "The function definitions" x+=1 return x def:定义函数的关键字test:函数名

Python成长笔记 - 基础篇 (十四)--堡垒机

堡垒机架构 堡垒机的主要作用权限控制和用户行为审计,堡垒机就像一个城堡的大门,城堡里的所有建筑就是你不同的业务系统 , 每个想进入城堡的人都必须经过城堡大门并经过大门守卫的授权,每个进入城堡的人必须且只能严格按守卫的分配进入指定的建筑,且每个建筑物还有自己的权限访问控制,不同级别的人可以到建筑物里不同楼层的访问级别也是不一样的.还有就是,每个进入城堡的人的所有行为和足迹都会被严格的监控和纪录下来,一旦发生犯罪事件,城堡管理人员就可以通过这些监控纪录来追踪责任人. 堡垒要想成功完全记到他的作用,只

Python成长笔记 - 基础篇 (八)

socket编程 应用层: 表示层: 会话层: 传输层: 网络层: ip地址 数据链路层: MAC地址 物理层: 协议类型: TCP/IP协议:三次握手,四次断开 2. Socket 参数介绍 socket.socket(family=AF_INET, type=SOCK_STREAM, proto=0, fileno=None)  必会 Create a new socket using the given address family, socket type and protocol nu

Python成长笔记 - 基础篇 (九)

创建一个socketserver 至少分以下几步: First, you must create a request handler class by subclassing the BaseRequestHandlerclass and overriding its handle() method; this method will process incoming requests.  Second, you must instantiate one of the server classe