Python学习

 Python 3.10.2

目录

一、Python的优点

二、Python解释器

 三、Python速览

①数字运算

②字符串

③列表

④元组

⑤集合

⑥字典

⑦print()函数

⑧其他

四、流程控制工具

①while循环

②if语句

③for语句

④range()函数

⑤循环中的else 子句

⑥pass语句

⑦match语句

⑧定义函数

⑨Lambda 表达式

五、数据结构

①列表、字典详解

②列表、集合、字典推导式

③循环的技巧

·items() 

·enumerate()

·zip() 

·reversed() 

·sorted() 

·去重

六、模块

七、输入与输出 

①旧式字符串格式化方法

②读写文件

八、错误和异常

九、类

①类的变量和成员函数

②类的继承


一、Python的优点

Python 程序简洁、易读,通常比实现同种功能的 C、C++、Java 代码短很多,原因如下:

  • 高级数据类型允许在单一语句中表述复杂操作;

  • 使用缩进,而不是括号实现代码块分组;

  • 无需预声明变量或参数。

Python 可以扩展:可以用C语言快速为解释器增加新的内置函数或模块,不论是内容管理让核心程序以最高速度运行,还是把 Python 程序链接到只提供预编译程序的库(比如,硬件图形库)。轻松能把 Python 解释器和用 C 开发的应用链接在一起,用它来扩展和控制该应用。

二、Python解释器

在Linix系统中,我们可以在编写的Python程序的开头加上两句话(不能调换位置)

第一句能让程序在拥有可执行权限的情况下通过./+程序名运行该程序

第二句话表示该程序运用UTF-8编码(默认UTF-8编码)

#!/usr/bin/env python3
# -*- coding: UTF-8 -*-

在BSD等类Unix系统上,Python脚本可以直接执行,就像shell脚本一样,第一行添加:

#!/usr/bin/env python3.5

(假设解释器位于用户的 PATH )脚本的开头,并将文件设置为可执行。 #! 必须是文件的前两个字符。在某些平台上,第一行必须以Unix样式的行结尾('\n')结束,而不是以Windows('\r\n')行结尾。请注意,散列或磅字符 '#' 在Python中代表注释开始。

可以使用 chmod 命令为脚本提供可执行模式或权限。

$ chmod +x myscript.py

 三、Python速览

①数字运算

除法运算(/)返回浮点数,用 // 运算符执行向下取整的结果是整数,计算余数用 %,计算乘方用**,等号(=)用于给变量赋值。赋值后,下一个交互提示符的位置不显示任何结果;如果变量未定义(即,未赋值),使用该变量会提示错误;Python 全面支持浮点数;混合类型运算数的运算会把整数转换为浮点数;交互模式下,上次输出的表达式会赋给变量 _

用round(x,2)对变量x保留两位小数(银行家舍入法(四舍六入五考虑,五后非零就进一,五后为零看奇偶,五前为偶应舍去,五前为奇要进一)也有可能因为精度的问题而导致输出的数与我们所期盼的数不同)。

用bin()可以将数字转化为二进制表示

②字符串

字符串:用单引号和双引号是一样的,反斜杠 \ 用于转义。(建议用print输出);如果不希望前置 \ 的字符转义成特殊字符,可以使用 原始字符串,在引号前添加 r 即可。

字符串字面值可以实现跨行连续输入。实现方式是用三引号:"""...""" 或 '''...''',字符串行尾会自动加上回车换行,如果不需要回车换行,在行尾添加 \ 即可。

字符串可以用 + 合并(粘到一起),也可以用 * 重复。

相邻的两个或多个 字符串字面值 (引号标注的字符)会自动合并。

字符串的编号可以从第一个字符(0)开始,也可以从最后一个字符(-1)开始。

Python支持切片索引提取子字符串(str[x:y]),切片索引省略开始索引时,默认值为 0,省略结束索引时,默认为到字符串的结尾。(输出结果包含切片开始,但不包含切片结束。因此,str[:i] + str[i:] 总是等于 s

Python 字符串不能修改,为字符串中某个索引位置赋值会报错。

内置函数 len() 返回字符串的长度。

③列表

Python支持多种复合数据类型,可将不同值组合在一起。最常用的列表是用[ ]标注,逗号分隔的一组值。列表 可以包含不同类型的元素,但一般情况下,各个元素的类型相同。

切片操作返回包含请求元素的新列表(b=a[:]是将a复制给b(浅拷贝/不完全复制),如果用b=a,相当于b是a的别名,更改b的同时也会更改a)。

浅拷贝:拷贝父对象,不会拷贝对象的内部的子对象。列表里的子对象仍然指向统一对象

b = a.copy()

深度拷贝:copy 模块的 deepcopy 方法,完全拷贝了父对象及其子对象。

import copy
b=copy.deepcopy(a)

列表内容可以改变。

列表可以进行解包

a=[1,2,3]
x,y,z=a
print(x,y,z)
'''
print(1,2,3)
'''

str.append(x)或str+=x:在列表str的结尾添加新元素x。

为切片赋值可以改变列表大小,甚至清空整个列表。

列表可以嵌套列表。

④元组

Python 的元组与列表类似,不同之处在于元组的元素不能修改。

元组使用小括号 ( ),列表使用方括号 [ ]。

元组在定义的时候可以省略小括号。

元组创建很简单,只需要在括号中添加元素,并使用逗号隔开即可。

元组中只包含一个元素时,需要在元素后面添加逗号,否则括号会被当作运算符使用。

⑤集合

集合(set)是一个无序的不重复元素序列,填入相同的元素会自动去重。实际上,集合的底层是字典实现,集合所有元素都是字典的键对象。

使用大括号 { } 或者 set() 函数(set()函数只能接收一个参数,如果想一次传入多个参数,可以用()使其形成一个元组(参数)传入)创建集合。

注意:创建一个空集合必须用 set() 而不是 { },因为 { } 是用来创建一个空字典。

basket = {'apple', 'orange', 'apple', 'pear', 'orange', 'banana'}
print(basket)                      # 演示去重功能
print('orange' in basket)          # 快速判断元素是否在集合内

用add()添加元素

a={1,}
a.add(2)
print(a)
#结果为:{1, 2}

用remove()删除指定元素 

a={1,2}
a.remove(2)
print(a)
#结果为:{1}

用clear()清空集合

a={1,2}
a.clear()
print(a)
#结果为:set()

 两个集合间的运算: 

a - b       # 集合a中包含而集合b中不包含的元素
a | b       # 集合a或b中包含的所有元素
a & b       # 集合a和b中都包含了的元素
a ^ b       # 不同时包含于a和b的元素

⑥字典

字典是另一种可变容器模型,且可存储任意类型对象。

字典的每个键值 key=>value 对用冒号 : 分割,每个键值对之间用逗号 , 分割,整个字典包括在花括号 {} 中 ,格式如下所示:

d = {key1 : value1, key2 : value2 }

键一般是唯一的,如果重复最后的一个键值对会替换前面的,值不需要唯一

值可以取任何数据类型,但键必须是不可变的,如字符串,数字或元组

 字典值可以没有限制地取任何Python对象,可以是标准的对象,也可以是用户定义的,但键不行

⑦print()函数

print() 函数输出给定参数的值。与表达式不同,它能处理多个参数,包括浮点数与字符串。它输出的字符串不带引号,且各参数项之间会插入一个空格,这样可以实现更好的格式化操作。运用关键字参数 end 可以取消输出后面的换行, 或用另一个字符串结尾。

⑧其他

多重赋值: a, b = 0, 1(交换可以用a,b=b,a实现)

右表达式求值顺序为从左到右。

同一块语句的每一行的缩进相同。

Python的三目运算

y="zero" if x==0 else "not zero"
#如果x等于0那么y为zero,否则y为not zero

四、流程控制工具

①while循环

while循环只要条件保持为真就会一直执行。Python 和 C 一样,任何非零整数都为真,零为假。这个条件也可以是字符串或列表的值,事实上,任何序列都可以;长度非零就为真,空序列则为假。

while 条件:
    语句1
    语句2
    ....
循环外语句1
循环外语句2
....

②if语句

if 语句包含零个或多个elif子句,及可选的else子句。关键字elif 是else if的缩写,适用于避免过多的缩进。可以把if...elif...elif... 序列看作是其他语言中switch或case语句的替代品。

if 条件1:
    语句1
    语句2
elif 条件2:
    语句3
    语句4
else 条件3:
    语句5
    语句6
条件外语句1
条件外语句1

③for语句

Python 的for语句与 C 或 Pascal 中的不同。Python 的for语句不迭代算术递增数值,或是给予用户定义迭代步骤和暂停条件的能力(如 C),而是迭代列表或字符串等任意序列,元素的迭代顺序与在序列中出现的顺序一致。(Python中的for是遍历元素)

Python支持二元遍历

遍历某个字典的同时修改该字典的内容,很难获取想要的结果。要在遍历时修改字典的内容,应该遍历该字典的副本或创建新的字典:

users = {'Hans': 'active', 'Éléonore': 'inactive', '景太郎': 'active'}
#方法一:遍历复制的,然后去操作原先的
for user, status in users.copy().items():
    if status == 'inactive':
        del users[user]
#方法二:创建一个新的
active_users = {}
for user, status in users.items():
    if status == 'active':
        active_users[user] = status

④range()函数

range() 常用于生成左闭右开的数字序列,该函数可以生成算术级数,range()可以不从 0 开始,还可以按指定幅度递增(递增幅度称为 '步进',支持负数),若只填一个数,则默认从0开始。

range() 和 len() 组合在一起,可以按索引迭代序列:

strs = "Hello World."
for i in range(len(strs)):
    print(strs[i],end = " ")
#H e l l o   W o r l d . 

⑤循环中的else 子句

Python的循环语句支持 else 子句:

for 循环中,可迭代对象中的元素全部循环完毕时

 while 循环的条件为假时,执行该子句

总而言之:没有break语句终止循环,就会执行else子句

⑥pass语句

pass 语句不执行任何操作。语法上需要一个语句,但程序不实际执行任何动作时,可以使用该语句。pass 可以用作函数或条件子句的占位符。

⑦match语句

match 语句接受一个表达式并将它的值与以一个或多个 case 语句块形式给出的一系列模式进行比较。 这在表面上很类似 C (以及许多其他语言) 中的 switch 语句,但它还能够从值中提取子部分 (序列元素或对象属性) 并赋值给变量。

⑧定义函数

定义函数使用关键字def,后跟函数名与括号内的形参列表。

函数语句从下一行开始,并且必须缩进。

定义的函数中的return 语句返回函数的值,当return 语句不带表达式参数时返回 None。函数执行完毕退出也返回 None。

默认参数规则和C相同。

可以对定义函数时的变量进行赋值来进行传值

def MAX(a,b):
    if(a>b):
        return a
    else :
        return b
print(MAX(a=1,b=2))
#输出2

可以用*解包传入元组、列表,用**解包传入字典(必须要一一对应)

def MAX(a,b):
    if(a>b):
        return a
    else :
        return b
c=[1,2]
print(MAX(*c))
c= {'a':1, 'b':2}
print(MAX(**c))
'''
输出:
2
2
'''

⑨Lambda 表达式

lambda 关键字用于创建小巧的匿名函数。Lambda 函数可用于任何需要函数对象的地方。在语法上,匿名函数只能是单个表达式。lambda 函数可以引用包含作用域中的变量

add=lambda a, b: a+b
#函数名称=lambda 传入参数:传出参数

五、数据结构

①列表、字典详解

a.append(x)

 在列表末尾添加一个元素,相当于 a[len(a):] = [x] 

a.extend(iterable)

用可迭代对象的元素扩展列表。相当于 a[len(a):] = iterable 。
在list列表末尾一次性追加iterable序列中的多个值(用新列表扩展原来的列表)

a.insert(i, x)

在指定位置插入元素。第一个参数是插入元素的索引
因此,a.insert(0, x) 在列表开头插入元素, a.insert(len(a), x) 等同于 a.append(x) 

list.remove(x)

 从列表中删除第一个值为 x 的元素

a.pop(i)

删除列表中指定位置的元素,并返回被删除的元素
未指定位置时,a.pop() 删除并返回列表的最后一个元素

a.clear()

删除列表里的所有元素,相当于 del a[:] 。

list.index(x,start,end)

在list的start到end之间查找x,返回列表中第一次出现x的位置

list.count(x)

返回列表中元素 x 出现的次数

list.sort(key=None, reverse=False)

key -- 指定可迭代对象中的一个元素来进行排序,需要写一个函数进行

def takeSecond(q):
    return q[1]
list = [(2, 2), (3, 4), (4, 1), (1, 3)]
list.sort(key=takeSecond)
print(list)

reverse -- 排序规则,reverse = True 降序, reverse = False 升序(默认)

list.reverse()

翻转列表中的元素

②列表、集合、字典推导式

列表、集合、字典的推导式类似

列表推导式的方括号内包含以下内容:一个表达式,后面为一个 for 子句,然后,是零个或多个 for 或 if 子句。结果是由表达式依据 for 和 if 子句求值计算而得出一个新列表

'''
a=[]
for i in range(10):
    a.append(i**2)
print(a)
'''
a = [i**2 for i in range(10)]
print(a)

生成0-9的平方的列表

'''
a = []
for x in [1,2,3]:
    for y in [3,1,4]:
        if x != y:
            a.append((x, y))
print(a)
'''
a=[(x, y) for x in [1,2,3] for y in [3,1,4] if x != y]
print(a)

生成x!=y的列表

③循环的技巧

·items() 

在字典中循环时,用items()方法可同时取出键和对应的值

a= {'gallahad': 'the pure', 'robin': 'the brave'}
for k, v in a.items():
    print(k, v)

·enumerate()

在序列中循环时,用enumerate()函数可以同时取出位置索引和对应的值

for i, v in enumerate(['tic', 'tac', 'toe']):
    print(i, v)

·zip() 

同时循环两个或多个序列时,用zip()函数可以将其内的元素一一匹配

list1 = ['a', 'b', 'c']
list2 = [1,2,3]
for x,y in zip(list1, list2):
    print(x,y)

·reversed() 

逆向循环序列时,先正向定位序列,然后调用reversed()函数

for i in reversed(range(1, 10)):
    print(i)

·sorted() 

按指定顺序循环序列,可以用sorted()函数,在不改动原序列的基础上,返回一个重新的序列

basket = ['apple', 'orange', 'apple', 'pear', 'orange', 'banana']
for i in sorted(basket):
    print(i)

·去重

使用 set() 去除序列中的重复元素

使用 sorted() 加 set() 则按排序后的顺序,循环遍历序列中的唯一元素

basket = ['apple', 'orange', 'apple', 'pear', 'orange', 'banana']
for i in sorted(set(basket)):
    print(i)

六、模块

退出 Python 解释器后,再次进入时,之前在 Python 解释器中定义的函数和变量就丢失了。因此,编写较长程序时,建议用文本编辑器代替解释器,执行文件中的输入内容,这就是编写脚本。随着程序越来越长,为了方便维护,最好把脚本拆分成多个文件。编写脚本还一个好处,不同程序调用同一个函数时,不用每次把函数复制到各个程序。

为实现这些需求,Python 把各种定义存入一个文件,在脚本或解释器的交互式实例中使用。这个文件就是模块;模块中的定义可以 导入 到其他模块或主模块(在顶层和计算器模式下,执行脚本中可访问的变量集)。

模块是包含 Python 定义和语句的文件。其文件名是模块名加后缀名.py 。

'''
在以主文件为根的同目录下的python_lesson的文件夹内的a.py文件储存
def fib(n):    
    a, b = 0, 1
    while a < n:
        print(a, end=' ')
        a, b = b, a+b
    print()
'''
#可以通过下面这种方式导入a.py中的fib函数并用别名fib2
from python_lesson.a import fib as fib2
#或者用以下方式导入a.py,在调用fib函数时应为a.fib()
from python_lesson import a

七、输入与输出 

①旧式字符串格式化方法

% 运算符可用于字符串格式化。给定 'string' % values,则 string 中的 % 实例会以零个或多个 values 元素替换。(类似于C++中的printf中的格式操作)

import math
print('The value of pi is approximately %5.3f.' % math.pi)
#The value of pi is approximately 3.142.

②读写文件

fin=open(filename, mode)

第一个实参是文件名字符串

第二个实参是包含描述文件使用方式字符的字符串。mode 的值包括'r',表示文件只能读取;'w'表示只能写入(现有同名文件会被覆盖);'a'表示打开文件并追加内容,任何写入的数据会自动添加到文件末尾。'r+'表示打开文件进行读写。mode 省略时的默认值为 'r'

一般使用with关键字

'''
从本文件的同文件夹下的python_lesson里的test.txt中读取内容并命名为fin
'''
with open('python_lesson/test.txt','r') as fin:
    print(fin.read())
#
with open('python_lesson/test.txt', 'r') as fin:
    print(fin.readlines())                      #以列表的形式储存每一行内容
#
with open('python_lesson/test.txt','r') as fin:
    for line in fin:
        print(line,end='')                      #支持迭代操作,每行输出

读取 

'''
向本文件的同文件夹下的python_lesson里的test.txt中写入内容并命名为fout
'''
with open('python_lesson/test.txt','w') as fout:
    fout.write('输出的字符串')

输出

八、错误和异常

在实际应用程序中,finally 子句对于释放外部资源(例如文件或者网络连接)非常有用,无论是否成功使用资源

def divide(x, y):
    try:
        result = x / y
    except Exception as e:                       #遇到异常时输出异常
        print(str(e))
    else:                                        #没有遇到异常时输出结果
        print("result is", result)
    finally:                                     #无论有没有遇到异常都执行的语句
        print("executing finally clause")

九、类

①类的变量和成员函数

直接在类内定义一个变量,那么这个变量就相当于C++里的静态变量,所有的都共用这一个变量

class q:
    a=[]
a=q()
b=q()
a.a.append(1)
b.a.append(2)
print(a.a)
#结果为[1, 2]

如果要定义不共用的一般类则需用def __init__(self)

class q:
    def __init__(self):
        self.a=[]
a=q()
b=q()
a.a.append(1)
b.a.append(2)
print(a.a)
#结果为[1]

也可以和函数一样进行传参

class q:
    def __init__(self,x,y):
        self.a=[x,y]
a=q(7,7)
a.a +=[7,7]
print(a.a)
#结果为[7, 7, 7, 7]
'''
class q:
    def __init__(self,x,y):
        self.a=[x,y]
a=q(y=7,x=7)
a.a +=[7,7]
print(a.a)
'''
'''
class q:
    def __init__(self,x,y):
        self.a=[x,y]
b=[7,7]
a=q(*b)
a.a +=[7,7]
print(a.a)
'''

 Python可以在类的外部使用类内未定义的成员变量

class q:
    def __init__(self):
        self.a=[]
a=q()
a.x=5
print(a.x)
#结果为5

 Python中的成员函数

class q:
    def __init__(self):
        self.a=[]
    def update(self):
        for i in range(len(self.a)):
            self.a[i]*=2
a=q()
a.a +=[7,7,7,7]
a.update()
print(a.a)
#结果为[14, 14, 14, 14]

②类的继承

通过super().__init__()来调用基类的构造函数,如果没有super().__init__()语句,则无法调用q内的构造函数,但可以调用q内定义的值。

class q:
    def __init__(self):
        self.a=[]
class w(q):
    def __init__(self):
        super().__init__()
a=w()
print(a.a)
#结果为[]

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值