文章目录
1、python特点
1.1、优点
简单,开源,可移植性,解释性1,面向对象,可扩展性,丰富的库。
1.2、缺点
运行速度慢。
1.3、应用领域
云计算,科学计算和人工智能,web开发,金融。
youtube、豆瓣、知乎均为python开发。
2、python基础语法
2.1、编码
默认情况下,Python 3 源码文件以UTF-8编码,所有字符串都是 unicode 字符串。
编码方式
ASCII码:最早的编码,共128字符,仅英文字母,数字和一些符号。
Unicode码:统一所有语言的编码,2字节。
UTF-8码:为解决Unicode内存和存储空间的浪费问题把Unicode编码转化为可变长编码的UTF-8编码。UTF-8编码把常用的英文字母编码成1个字节,汉字通常是3个字节;如传输文本包含大量英文,用UTF-8编码就能节省空间。
计算机系统通用的字符编码工作方式
在计算机内存中统一使用Unicode编码,当保存到硬盘或需要传输时就转换为UTF-8编码。
用记事本编辑时,从文件读取的UTF-8字符被转换为Unicode到内存里,保存时再把Unicode转换为UTF-8;浏览网页时,服务器把动态生成的Unicode内容转换为UTF-8再传输到浏览器,网页源码如有类似
<meta charset="UTF-8" />
的信息则表示该网页以UTF-8编码。
2.2、标识符
由字母、数字和下划线组成,第一个字符必须是字母表中字母或下划线; 在 Python 3 中,可以用中文作为变量名,非 ASCII 标识符也允许。
2.3、保留字
import keyword
keyword.kwlist #输出当前版本的所有关键字
2.4、注释
单行注释以#
开头,多行注释可以用多个#
号或'''
和""
。
2.5、缩进
使用缩进来表示代码块,同一个代码块的语句必须包含相同的缩进空格数,不需要使用大括号 {}
。
2.6、行
- 一条语句多行
用反斜杠\\
来实现多行语句;在[], {},或()中的多行语句,不需要使用反斜杠\\
- 一行多条语句
语句间用分;
分割 - 空行
函数之间或类的方法之间用空行分隔,表示一段新的代码的开始;类和函数入口之间也用一行空行分隔,以突出函数入口的开始。空行与代码缩进不同,空行并不是python语法的一部分。
书写时不插入空行解释器也不会出错,空行的作用在于分隔两段不同功能或含义的代码以便于维护或重构。
2.7、输入输出
- 输入
input("")
#默认的input()为str格式,若用数学计算,则需要转换格式,如:
int(input())
- 输出
print()
#默认的print()是换行的,不换行需在变量末尾加上end="":
print( x, end=" " )
2.8、变量
Python 中的变量不需要声明;每个变量在使用前都必须赋值(可以为空),变量赋值以后该变量才会被创建。
在 Python 中,变量没有类型,我们所说的"类型"是变量内存中对象的类型。一个变量可以通过赋值指向不同类型的对象。
3、基本数据类型
六个标准数据类型:
不可变数据(3个) | 可变数据(3个) |
---|---|
Number(数字) | List(列表) |
String(字符串) | Dictionary(字典) |
Tuple(元组) | Set(集合) |
3.1、创建
str = 'python 3.8'
tuple = ('python', 3.8)
list = ['python', 3.8]
dict = {1: 'python', 'key2': 3.8}
set = {'python', 3.8}
3.2、操作特点
字符串 | 元组 | 列表 | 字典 | 集合 | |
---|---|---|---|---|---|
索引 | Y | Y | Y | 键 | N |
切片 | Y | Y | Y | N | N |
拼接操作符+和* | Y | Y | Y | N | N |
元素删改 | N | N | Y | Y | Y |
len()返回长度 | Y | Y | Y | Y | Y |
in判断元素包含 | Y | Y | Y | Y | Y |
- 列表的基本操作
#索引切片:
list=[1.2,'1',['a',1],(1,2),{'name':'zhangsan'}]
print(test[2]) #索引
print(test[0:3]) #切片,左闭右开
['a',1]
[1.2,'1',['a',1]]
list=[1.2,'1',['a',1],(1,2),{'name':'zhangsan'}
#增加:
list.append('list') #加在最后
list.extend(['list',10,'hello']) #增加多个,用列表[]
list.insert(0,'list') #索引插入
#修改
list[1]='list'
#删除
list.remove(1.2) #根据元素输出
list.pop() #索引缺省,默认删除最后一个元素
del list[0] #根据索引删除
list.clear() #清除全部元素
- 访问字典要用键而不能索引,如:
dict['key1']
;字典的键必须不可变,可以用数字、字符串或元组,不能是列表。 - 集合是无序的不重复元素序列
3.3、Number(数字)
int、float、bool、complex(复数)
- 在Python 3里,只有一种整数类型 int,表示为长整型,没有 python2 中的 Long。
- 在 Python2 中没有布尔型,用数字 0 表示 False,用 1 表示 True; Python3 中,把 True 和 False 定义成关键字,但它们的值还是 1 和 0,且能和数字相加。
3.4、String(字符串)
屏蔽转义:以r或R置于字符串引号前;
三引号允许一个字符串跨多行。
- 字符串格式化
%
操作符:
print(' pi is approximately %5.3f' % math.pi)
>>>pi is approximately 3.142
- f-string (python3.6以上支持)
f-string格式化方法以f开头,后面跟着字符串,字符串中的表达式用大括号 {} 包起来,它会将变量或表达式计算后的值替换进去,相比%方法不用再去判断使用%s还是%d。
print(f' pi is approximately {math.pi:.3f}')
>>>pi is approximately 3.142
- 字符串的format()方法
print(' the {} who say "{}!"'.format('knights', 'Ni'))
>>>the knights who say "Ni!"
3.5、type()和isinstance()
内置的 type() 函数可以用来查询变量所指的对象类型:
print(type(a))
<class 'int'>
或用 isinstance 来判断:
>>>isinstance(a, int)
>>>True
isinstance 和 type 的区别在于:type()不会认为子类是一种父类类型,而isinstance()会。
4、流程控制
1.if语句
if...elif...elif...
代替switch...case...
语句 。
2.while语句
3.for语句
for...in...
对任意序列进行迭代,遍历数字序列时用range()语句:
for i in range(0, 10, 1) #步进
4.break和continue语句
break用于跳出最近的for或while循环,continue表示继续循环中的下一次迭代.
5.else子句
在if,while和for中均可使用;
循环被break和continue中止时不运行else子句。
6.pass语句
占位。
5、模块
5.1、函数
- 参数传递
传递不可变数据时,函数内的操作并不影响变量本身(类似值传递),而对于可变传递则修改后外部变量也受影响(类似引用传递)。
类似地,函数内部定义的变量有一个局部作用域,定义在函数外的拥有全局作用域。当内部作用域想修改外部作用域的变量时,要用到global和nonlocal关键字。 - 函数定义与调用的形式
- 默认参数
调用函数时,如果没有传递参数,则会使用默认参数。- 关键字参数
使用关键字参数允许函数调用时参数的顺序与声明时不一致。- 不定长参数
加星号*
的参数会以元组的形式导入,存放所有未命名的变量参数,加两个星号**
的参数以字典形式导入。- 匿名函数
使用lambda来创建匿名函数,即不再使用def语句这样的标准形式定义函数。
5.2、模块和包
模块的使用使得不同模块的作者不必担心彼此的全局变量名称一样;包则是一种通过用“带点号的模块名”来构造Python模块命名空间的方法,使用加点的模块名可以使得多模块软件包的作者不必担心彼此的模块名称一样。
__name__
属性
一个模块被另一个程序第一次引入时,其主程序将运行。如果要在模块被引入时使模块中的某一程序块不执行,可用__name__
属性:每个模块都有一个__name__
属性,当其值是__name__
时,表明该模块自身在运行,否则是被引入。用法:
if __name__ == '__main__':
-
当使用变式
from fibo import fib, fib2
时,fibo未定义。 -
__init__.py
当python检测到一个目录下存在__init__.py
文件时,python就会把它当成一个模块(module);__init__.py
可以是一个空文件,也可以有非常丰富的内容。 -
调用另一个文件的类或函数
以pycharm为例,将目录标记为根目录即可通过from … import …调用,如:from add1 import add_method_1
参:https://blog.youkuaiyun.com/u010013191/article/details/89071785
5.3、作用域
- 全局变量和局部变量:定义在函数内部的变量拥有一个局部作用域,定义在函数外的拥有全局作用域。局部变量只能在其被声明的函数内部访问,而全局变量可以在整个程序范围内访问。调用函数时,所有在函数内声明的变量名称都将被加入到作用域中。
- global将变量修改为全局变量。
6、类
6.1、类的定义
类的定义包含属性和方法的定义,类定义的方法中一般包含构造方法__init__()
;定义在方法中的变量,只作用于当前实例的类。
- 类的私有属性
__private_attrs
:两个下划线开头,声明该属性为私有,不能在类的外部被使用或直接访问。在类内部的方法中使用时 :self.__private_attrs
。 - 类的方法
在类的内部,使用 def 关键字来定义一个方法,与一般函数定义不同,类方法必须包含参数self,且为第一个参数,self 代表的是类的实例。
self 的名字并不是规定死的,也可以使用 this,但最好还是按约定用 self。 - 类的私有方法
__private_method
:两个下划线开头,声明该方法为私有方法,只能在类的内部调用,不能在类的外部调用:self.__private_methods
。
6.2、实例化类
类实例化时会自动调用构造方法__init__()
,类实例化后可以引用属性和方法。
6.3、继承和重写
子类(派生类 DerivedClassName)会继承父类(基类 BaseClassName)的属性和方法。
class people:
def __init__(self, n, a, w):
self.name = n
self.age = a
self.__weight = w
def speak(self):
print("%s 说: 我 %d 岁。" %(self.name,self.age))
# 单继承示例
class student(people):
grade = ''
def __init__(self, n, a, w, g):
# 调用父类的构造方法
people.__init__(self, n, a, w)
self.grade = g
# 重写父类的方法
def speak(self):
print("%s 说: 我 %d 岁了,在读 %d 年级" % (self.name, self.age, self.grade))
- 多继承
class sample(speaker,student):
- super() 函数
super(Class, self).xxx
可以调用父类(超类)的方法,super()
用来解决多重继承问题,直接用类名调用父类方法在使用单继承的时候没问题,但是如果使用多继承,会涉及到查找顺序、重复调用等问题。
Python 3可以用
super().xxx
的形式。
__call__()
方法
该方法使得类实例对象可以像调用普通函数那样,以对象名()
的形式使用。
7、异常
1.捕捉异常:
try...except...else...finally
发生异常执行except:
后的代码,没有发生异常执行else:
后的,finally
则是无论有没有异常都会执行。
2.抛出异常(主动):
raise语句。
3.用户自定义异常:
通过创建一个新的异常类来拥有自己的异常。异常类继承自 Exception 类,可以直接继承,或者间接继承。
8、其他
- with as语句
使用with as语句操作上下文管理器(context manager),能自动分配并释放资源,如:
with open("/tmp/foo.txt") as file:
data = file.read()
解释性:Python语言写的程序无需编译成二进制,可直接从源代码运行程序。在计算机内部,python 解释器把源代码转换成称作字节码的中间形式,再翻译成机器语言并运行。 ↩︎