搜索文章

输入标题或内容中的关键词。

← 回到技术手记
编程

Python 学习笔记(一):基础语法、流程控制与字符串

gemhack··20 分钟阅读

本文整理 Python 3 的相关学习笔记,示例按各小节说明理解。

基础

1.python介绍

python是解释型的编程语言,不需要编译器(compile),需要解释器(interpreter),我们所安装的python2.7,python3等等版本都是python的解释器,python底层是使用c语言编写的,也有用java编写的,主要是使用cpython。python文件以.py结尾,python语法以缩进作为解释的重要依据,所以不能随意缩进,每一行代码不需要以分号结尾。

2.注释格式

# 这是单行注释,官方规范建议在井号和注释文本之间有一个空格
'''
这是多行注释格式,python不区分单引号'和双引号",所以注释和字符串都可以使用单引号或者双引号
'''
"""
这也是多行注释
"""

3.编码声明

Python 脚本第一或第二行的注释匹配正则表达式 coding[=:]\s*([-\w.]+) 时,该注释会被当作编码声明;这个表达式的第一组指定了源码文件的编码。编码声明必须独占一行,在第二行时,则第一行必须也是注释。编码表达式的形式如下:

# -*- coding: <encoding-name> -*-

这也是 GNU Emacs 认可的形式,此外,还支持如下形式:

# vim:fileencoding=<encoding-name>

这是 Bram Moolenaar 的 VIM 认可的形式。

如果没有找到编码格式声明,则默认编码格式为 UTF-8。

4.拼接行

1.显式

两个及两个以上的物理行可用反斜杠(\)拼接为一个逻辑行,规则如下:以不在字符串或注释内的反斜杠结尾时,物理行将与下一行拼接成一个逻辑行,并删除反斜杠及其后的换行符。例如:

if 1900 < year < 2100 and 1 <= month <= 12 \
   and 1 <= day <= 31 and 0 <= hour < 24 \
   and 0 <= minute < 60 and 0 <= second < 60:   # Looks like a valid date
        return 1

以反斜杠结尾的行,不能加注释;反斜杠也不能拼接注释。除字符串字面值外,反斜杠不能拼接形符(如,除字符串字面值外,不能用反斜杠把形符切分至两个物理行)。反斜杠只能在代码的字符串字面值里,在其他任何位置都是非法的。

2.隐式

圆括号、方括号、花括号内的表达式可以分成多个物理行,不必使用反斜杠。例如:

month_names = ['Januari', 'Februari', 'Maart',      # These are the
               'April',   'Mei',      'Juni',       # Dutch names
               'Juli',    'Augustus', 'September',  # for the months
               'Oktober', 'November', 'December']   # of the year

隐式行拼接可含注释;后续行的缩进并不重要;还支持空的后续行。隐式拼接行之间没有 NEWLINE 形符。

变量与数据类型

1.变量

Python 是动态类型、强类型语言。变量名绑定到对象,定义变量时无需显式声明类型。

number = 123
name = 'zhangsan'

查看变量的数据类型(实际上是查看变量值的数据类型)的方法是使用函数type()

type(444)
type(23.24)
name = "lisi"
type(name)

标识符的命名规范:

只能以字母,数字和下划线组成,中文也可以,但是不推荐。

数字不能开头。

区分大小写,不能使用关键字。

2.数据类型

在python的六大标准数据类型中:

不可变数据(3 个):Number(数字)、String(字符串)、Tuple(元组); 可变数据(3 个):List(列表)、Dictionary(字典)、Set(集合)。

1.Number数字数据类型:

整数int:长度无限,直至内存装不下。

浮点数float:默认使用IEEE754规范,精度在15-17位

复数complex:复数由实数部分和虚数部分构成,可以用a + bj,或者complex(a,b)表示, complex(a)则表示虚部为0。复数的实部a和虚部b都是浮点型。

v1 = 12
v2 = 3.14
v3 = 5+8.2j
print(type(v1),type(v2),type(v3))# <class 'int'> <class 'float'> <class 'complex'>
print(v3)# (5+8.2j)

布尔型bool:布尔类型只有两个值:True 和 False。bool 是 int 的子类,因此布尔值可以被看作整数来使用,其中 True 等价于 1。False等价于0。布尔类型可以和其他数据类型进行比较,比如数字、字符串等。在比较时,Python 会将 True 视为 1,False 视为 0。

注意: 在 Python 中,所有非零的数字和非空的字符串、列表、元组等数据类型都被视为 True,只有 0、空字符串、空列表、空元组等被视为 False。

2.str 字符串类型,具体操作见下文字符串一节。

3.数据类型转换

在python中提供了函数将参数转为指定的类型。如int(),str(),chr(),float()

int_value = int(11.23)
char_value = char(98)
str_value = str(54.230)
float_value = float('12.35')

但是需要注意是否可以发生转换。

任何基本数据类型都可以转换为字符串类型,但是字符串在转为Number的时候,如果字符串中的数据中包含非数字就会报错,无法转换。并且float类型的字符串也无法使用int()函数直接转换为整数,但是float类型的数据可以会自动将小数部分截去转换为整数。

int_value = int("23.44")# 错误
int_value2 = int(23.54)# 正确,=23

运算符

1.算术运算符

+,-,*,/ 加减乘除
// 整除,除了之后取整数
** 指数运算
% 取模,除法取余数

2.赋值运算符

= 直接赋值
+=,-=,/=,*= 作加减乘除后赋值
%= 取模后赋值
//=,**= 作整除、指数后赋值

注意:// 得到的并不一定是整数类型的数,它与分母分子的数据类型有关系。

3.比较运算符

== 等于
!= 不等于
<,> 大于/小于
<=,>= 大于等于/大于小于

分支结构

1.判断语句

1.if else

'''
格式1 单分支
if 条件 :# 有冒号
    ...# if代码块中的内容需要缩进
    ...
else:# else也有冒号,也需要缩进
    ...
    ...
'''
age  = int(input('请输入年龄:'))
if age >= 18:
    print('已成年')
else:
    print('未成年')
'''
格式2 多分支
if 条件:
    ...
elif 条件:
    ...
elif 条件:
    ...
else:
    ...
'''
age  = int(input('请输入年龄:'))
if age >= 60:
    print('老人')
elif age >= 30:
    print('壮年')
elif age >= 18:
    print('青年')
else:
    print('儿童')
'''
格式2 条件嵌套
if 条件:
    if 子条件:
        ...
    else:
        ...
elif 条件:
    if 子条件:
        ...
    else:
        ...
else:
    ...
'''
if age >=  18:
    if age >= 40:
        print('大人')
    else:
        print('年轻人')
else:
    print('儿童')

2.match

Python 3.10 增加了 match…case 的条件判断,不需要再使用一连串的 if-else 来判断了。match 后的对象会依次与 case 后的内容进行匹配,如果匹配成功,则执行匹配到的表达式,否则直接跳过,_ 可以匹配一切。

语法格式如下:

match subject:
    case <pattern_1>:
        <action_1>
    case <pattern_2>:
        <action_2>
    case <pattern_3>:
        <action_3>
    case _:
        <action_wildcard>

一个 case 也可以设置多个匹配条件,条件使用 | 隔开,例如:

...
    case 401|403|404:
        return "Not allowed"

2.while循环语句

Python 中 while 语句的一般形式:

while condition:
    statements……

同样需要注意冒号和缩进。另外,在 Python 中没有 do..while 循环。

while循环还可以结合else语句使用,表示条件成立的时候一直执行while内的语句,当条件不成立之后执行else内的语句。else内的语句仅执行一次。

语法格式如下:

while <expr>:
    <statement(s)>
else:
    <additional_statement(s)>

例如:

age = 2;
while age <= 18:
    print('我今年%d岁了' % age)
    age += 1
else:
    print('我今年成年了')

类似 if 语句的语法,如果while 循环体中只有一条语句,可以将该语句与 while 写在同一行中

while i < 10 : print(i)

3.for循环与range()函数

Python for 循环可以遍历任何可迭代对象,如一个列表或者一个字符串。

for循环的一般格式如下:

for <variable> in <sequence>:
    <statements>
else:
    <statements>

例如:

words = 'hello'
for i in words:
    print(i)
'''
h
e
l
l
o
'''
arr = [1,2,'c','d',True]
for i in arr;
    print(i)
'''
1
2
c
d
True
'''

for循环通常结合range()函数来使用,利用range()函数生成一个数列,然后使用for来循环

range()函数的使用

python3 range() 函数返回的是一个可迭代对象(类型是对象),而不是列表类型, 所以打印的时候不会打印列表。

Python3 list() 函数是对象迭代器,可以把 range() 返回的可迭代对象转为一个列表,返回的变量类型为列表。

Python2 range()函数返回的是列表。

# range(stop)
# range(start, stop[, step])
# 1.一个参数时表示右端点,左端点默认为0
range(5) # 0,1,2,3,4
# 2.生成指定区间的左闭右开的数列,默认步长为1
range(5,10) #5,6,7,8,9
# 3.生成一个指定区间的数列,指定步长
range(1,50,5)# 1,6,11,16,21,26,31,36,41,46
# 4.将可迭代对象转换为列表
list(range(0,100,5))# [0, 5, 10, 15, 20, 25, 30, 35, 40, 45, 50, 55, 60, 65, 70, 75, 80, 85, 90, 95]

for同样可以与else语句合用,在循环结束之后执行一次else语句

for item in iterable:
    # 循环主体
else:
    # 循环结束后执行的代码

4.循环控制语句

break 语句可以跳出 for 和 while 的循环体。如果从 for 或 while 循环中终止,任何对应的循环 else 块将不执行。

continue 语句被用来告诉 Python 跳过当前循环块中的剩余语句,然后继续进行下一轮循环。

**else 子句 **在穷尽列表(以for循环)或条件变为 false (以while循环)导致循环终止时被执行,但循环被 break 终止时不执行。

pass 语句无任何意义,通常用于占位,以保证代码结构的完整性。

for i in range(10):
    if i%5 == 0 :
        pass
    else:
        print(i)
'''
1
2
3
4
6
7
8
9
'''

字符串

1.字符串的定义

python中的字符串定义方式有三种,分别使用单引号”,多引号””,和三引号””””””并且三引号定义的字符串允许换行,格式会保留下来。三引号也可以使用单引号。

str1 = '字符串1'
str2 = "字符串2"
str3 = """字符串3"""
str4 = """
这是一个字符串
我可以换行,也是一样的。
"""

2.字符串的拼接

1.python中使用+拼接合并多个变量,或合并变量与字面值。但是只能拼接字符串,不能拼接字符串和其他变量

str1 = 'this'
str2 = 'key'
str  = str1 + str2 # 正确
int1 = 123
str3 = str1 + int11 # TypeError: can only concatenate str (not "int") to str

2.当两个字符串并在一起的时候会自动拼接,这项功能只能用于两个字面值,不能用于变量或表达式

str1 = 'this'
str = "我是""张三"
print(str) # 我是张三
print(str1'is a key')# 错误,不能拼接变量或者表达式

3.字符串的类型

1.普通字符串

使用成对的单双引号或者三引号定义的字符串,会解析其中的转义字符,比如\n,\r等。

str = '这是一个普通的字符串\n但是会换行'
print(str)
# 这是一个普通
# 但是会换行

2.格式字符串(f字符串)

有前缀”f”或者”F”的字符串,其中可以包含{},用于格式化,详见下一小节

3.原始字符串(r字符串)

带有前缀 ‘r’ 或 ‘R’的字符串称为原始字符串,原始字符串把反斜杠当作原义字符,不执行转义操作。

str = r'这是一个原始的字符串\n不会换行'
print(str)# 这是一个原始的字符串\n不会换行

4.b字符串

带有前缀 ‘b’ 或 ‘B’的字符串,其表示的是一个bytes类型的数据,而不是一个str类型的数据。因此这个字符串中的值必须是ascii码在128之内,超过128的必须转义。

4.字符串的格式化

1.使用printf风格的格式化

# 在python中可以直接使用%占位符来格式化,格式为 "文本内容(占位符%)(占位数据类型s,n,f...)" % (替换的字面量或者变量)
name = 'zhangsan'
age = 18
print('my name is %s, I am %d years old.' % (name,age))# my name is zhangsan, I am 18 years old.

当占位符出现多个时,填充的数据需要用()括起来,并且按顺序填写,用逗号隔开。

占位的数据类型有如下

'd' 有符号十进制整数。
'i' 有符号十进制整数。
'o' 有符号八进制数。 (1)
'x' 有符号十六进制数(小写)。 (2)
'X' 有符号十六进制数(大写)。 (2)
'e' 浮点指数格式(小写)。 (3)
'E' 浮点指数格式(大写)。 (3)
'f' 浮点十进制格式。 (3)
'F' 浮点十进制格式。 (3)
'g' 浮点格式。 如果指数小于 -4 或不小于精度则使用小写指数格式,否则使用十进制格式。 (4)
'G' 浮点格式。 如果指数小于 -4 或不小于精度则使用大写指数格式,否则使用十进制格式。 (4)
'c' 单个字符(接受整数或单个字符的字符串)。
'r' 字符串(使用 repr() 转换任何 Python 对象)。 (5)
's' 字符串(使用 str() 转换任何 Python 对象)。 (5)
'a' 字符串(使用 ascii() 转换任何 Python 对象)。 (5)
'%' 不转换参数,在结果中输出一个 '%' 字符。

(1)此替代形式会在第一个数码之前插入标示八进制数的前缀 ('0o')。

(2)此替代形式会在第一个数码之前插入 '0x' 或 '0X' 前缀(取决于是使用 'x' 还是 'X' 格式)。

(3)此替代形式总是会在结果中包含一个小数点,即使其后并没有数码。小数点后的数码位数由精度决定,默认为 6。

(4)此替代形式总是会在结果中包含一个小数点,末尾各位的零不会如其他情况下那样被移除。小数点前后的有效数码位数由精度决定,默认为 6。

(5)如果精度为 N,输出将截短为 N 个字符。

常用%s,%d,%f

用这种格式化方法可以控制输出的字符宽度和数据的精度,用m.n来表示,m,n均为整数,m表示输出的宽度,n表示小数的位数

number = 125.26
print("the number is %8.3f"  % number)# the number is  125.260

2.使用f字符串格式化

格式字符串字面值 或称 f-string 是标注了 'f' 或 'F' 前缀的字符串字面值。这种字符串可包含替换字段,即以 {} 标注的表达式。其他字符串字面值只是常量,格式字符串字面值则是可在运行时求值的表达式。

# f"这是一个f字符串,其中包含的{}中的表达式会被解析成结果,其外的内容当做普通字符串处理,{{}}会被解析为{}"
name = 'zhangsan'
age = 18
str = f"我的名字叫{name},我今年{age}岁了,明年我就{age + 1}岁了"
# 我的名字叫zhangsan,我今年18岁了,明年我就19岁了

参考资料

评论发表评论

评论

发表评论

邮箱不会公开。标有 * 的项目为必填项。