博文配套视频课程:24小时实现从零到AI人工智能
常见概念梳理
在一个软件设计与开发中,所有包名、类名、函数名、变量名都应该遵循一定的开发规范
- 如无特殊情况, 文件一律使用 UTF-8 编码
- 代码避免采用空格缩进,统一使用Tab进行缩进
- 块级函数和类定义之间空二行,类成员与函数之间空一行
- 模块尽量使用小写命名,首字母保持小写,如果有多个单词采用下划线分割
- 类名使用驼峰(CamelCase)命名风格,首字母大写,私有类可用一个下划线开头
- 函数名一律小写,如有多个单词,用下划线隔开
- 变量名尽量小写, 如有多个单词,用下划线隔开
自定义和调用函数时,可使用的正式参数类型有四种
- 必需参数:必须以正确的顺序传入函数。调用时的数量必须和声明时的一样否则会报错
- 默认参数:调用函数时,如果没有传递参数,则会使用默认参数,默认参数间接实现Python多态性
- 不定长参数:加了星号 * 的参数会以元组(tuple)的形式导入,存放所有未命名的变量参数
- 关键字参数:使用关键字参数允许函数调用时参数的顺序与声明时不一致,因为 Python 解释器能够用参数名匹配参数值
def show(a,b=10,*c,**d):
print(f'a={a},b={b},c={c},d={d}')
show(1,2,3,4,5,d=6)
Python 中,程序的变量并不是在哪个位置都可以访问的,访问权限决定于这个变量是在哪里赋值的
- Python 中只有模块(module),类(class)以及函数(def、lambda)才会引入新的作用域
- if/elif/else/、try/except、for/while等)是不会引入新的作用域的,也就是说这些语句内定义的变量,外部也可以访问
- 当内部作用域想修改外部作用域的变量时,就要用到global关键字了。
a = 1
def show():
a = 2 # 就近原则
a += 1
print(f'show a={a}')
show()
print(f'out:{a}')
def show2():
global a # 注释会抛出异常
a += 1
print(f'show2={a}')
show2()
print(f'out:{a}')
Py中装饰器语法复习
- 一切皆为对象,函数也是一个对象,而函数名称就是对象名称
- 可以在函数中定义和返回另一个函数
- 使用 @ 符号引用已有的函数(比如 @classmethod)后,可用于修饰其他函数,装饰被修饰的函数
- 装饰器在日志、权限、函数执行时间等场景中使用比较多
# 类也是对象
class Demo():
def show(self):
a = 2 # 就近原则
def inner():
pass
# 对象也是对象
demo = Demo()
demo.show()
print(locals())
模块是一个包含所有你定义的类、函数、变量的文件,py为后缀。模块可以被别的程序引入,以使用该模块中的对象
- 一个模块只会被导入一次,不管你执行了多少次import。这样可以防止导入模块被一遍又一遍地执行,第一次被执行时被导入模块会生成pyc格式的文件
- Python 的 from 语句让你从模块中导入一个指定的部分到当前命名空间中
- 每个模块都有一个__name__属性,当其值是’main’时,表明该模块自身在运行,否则是被引入
- 如果包定义文件 init.py 存在一个叫做 all 的列表变量,那么在使用 from package import * 的时候就把这个列表中的所有名字作为包内容导入
- 搜索路径是在Python编译或安装的时候确定的,安装新的库应该也会修改。搜索路径被存储在sys模块中的path变量
In [4]: import sys
In [5]: sys.path
Out[5]:
['D:\\Anaconda3\\Scripts',
'D:\\Anaconda3\\python37.zip',
'D:\\Anaconda3\\DLLs',
'D:\\Anaconda3\\lib',
'D:\\Anaconda3',
Python OOP相关概念
- 两个下划线开头,声明该属性或者方法为私有,不能在类的外部被使用或直接访问
- init : 构造函数,在生成对象时调用,del : 析构函数,释放对象时使用
- 多态性分为重写与重载,子类可以重写父类声明的方法而方法中可变参数与关键字参数是Py多态性表现形式
class Person(object):
def __init__(self, name):
self.name = name
def __del__(self):
print(f"实例对象:{self.name}")
print(f"python解释器开始回收{self.name}对象了")
print("类对象", id(Person))
zhangsan = Person("张三")
print("实例对象张三:", id(zhangsan))
# input('按任意键自动退出')
Py面向对象浅谈
- 面向对象是相对于面向过程而言的
- 面向过程语言是一种基于功能分析的、以算法为中心的程序设计方法;而面向对象是一种基于结构分析的、以数据为中心的程序设计思想
- 在面向对象语言中有一个有很重要东西,叫做类,类是所有对象的模板
- 面向对象程序设计的一个关键性观念是将数据和数据的操作封装在一起,组成一个相互依存,不可分割的整体
Http请求中get与post的区别
- 最直接的区别,GET请求的参数是放在URL里的,POST请求参数是放在请求body里的
- GET请求的URL传参有长度限制,而POST请求没有长度限制
- GET请求的参数只能是ASCII码,所以中文需要URL编码,Post请求没有此限制,因此可以传输多媒体数据
- Get比Post要更加省资源
Py中函数与方法的区别
- 方法一般指与特定实例绑定的函数,通过对象调用方法时,对象本身将会被作为第一个参数传入 (系统自带)
- 普通函数没有self概念,普通的函数定义在模块中,而方法定义在类中
- 方法通常操作自身对象的属性(例如对当前属性列表进行排序),而函数在进行操作时通常指明排序对象 (例如系统内置函数sorted函数)
- 因为方式是定义在类中,因此方法定义肯定有缩进。而函数定义在模块中,因此它在定义时并不会缩进
你需要了解的self关键字
- self在对象的方法中表示当前对象本身,如果通过对象调用一个方法,那么该对象会自动传入到当前方法 的第一个参数中
- self并不是关键字,只是一个用于接受对象的普通参数,理论上可以用任何一个普通变量名代替
- 方法中有self形参的方法成为非绑定类的方法,可以通过对象访问, 没有self的是绑定类的方法, 只能通过类访问
- 使用类访问绑定类的方法时, 如果类方法中需要访问当前类的成员,可以通过 class成员名来访问
class A(object):
# 属性默认为类属性(可以给直接被类本身调用)
num = "类属性"
# 类方法(不需要实例化类就可以被类本身调用)
@classmethod
def func2(cls): # cls : 表示没用被实例化的类本身
print(f"func2 A ID{id(cls)}")
print(cls.num)
print('A ID', id(A))
a1 = A()
a1.func2()
A.num = '新类属性'
a2 = A()
a2.func2()