课程链接:https://aistudio.baidu.com/aistudio/course/introduce/7073
通过上面的课程的学习,从中收获了不少心得,以下是我总结的一些心得,希望对大家学习Python3有所帮助
温馨提示:
本课程是通过网页的Notebook进行学习Python3的,目前Notebook Python版本是3.7.4
若要在本地进行开发,建议使用anaconda3 + Pycharm 的组合比较友好,其原因是Python本体版本各个库之间存在兼容性冲突的问题,而anaconda3会进行版本兼容性进行调整,避免这种开发困扰。这两个东西是要安装在本地,课程中会提到。
python是一个工具 需要
练习!练习!练习!
应用!应用!应用!
1.手敲代码
2.理解后独立复现
3.学会找BUG、找BUG
正文
Python 作为一门高级的编程语言却与其他编程语言来说入门是简单的,其三大特点就是
- 代码量少
- 易于理解
- 拓展性强(第三方库多)
Python标识符
- 由英文字母、下划线和数字组成,其余字符不行
- 开头字符不能是数字
- 区分英文字母大小写
Python的关键字
注意:前三个是首字母要大写,其余是小写的
Python运算符
Python基本类型
Python在写变量时是不用声明变量类型的,会自动识别对于的基本类型
举个列子: a = 0
基本数字类型
容量大小分布(优先级):bool(布尔)< int(整型) < float(浮点) < complex(复数)
字符串类型
str
基本容器类型——可以存储各种类型数据
Python的基本类型是可以相互转化的,通过以下格式
- 基本类型() 如str()
值得注意的是:将字符串转换为数字类型,需要先转换成对应最高级别数字类型
举个例子:
num = '1.6'
num = float(num)
num = int(num)
若直接转换成int会报错的
Python的注释
- #用于单行注释
-
'''
用一对三个单引号(''')用于多行注释
'''
Pythont条件判断和循环
注意是半角的冒号(:)和缩进
判断:
- if and/or语句:
- elif and/or语句:
- else:
循环
while and/or语句:
for ... in ... :
else:
循环中常用的关键字有continue,break,pass
Python常用内置函数:
- id():获取对象的内存地址或者说是识别码
- help():帮助函数,其内容可以是类型也可以是函数名
- print():打印函数
- len():获取数据长度
- range():范围函数 range(start, stop[, step]) 其中stop必填,默认从0开始
- input():输入函数
- ...
字符串进阶
索引
索引支持双向索引(正向递增;反向递减)
切片
字符串[start: end: step]
注意是左闭右开
以下是str常用的函数
find() 查找功能
返回从左第一个指定字符的索引,找不到返回-1
count() 计数功能
无重复从0开始计数对应字符串,找不到会返回0
index() 查找
返回从左第一个指定字符的索引,找不到报错
split() 字符串的拆分
按照指定的内容进行分割,缺省时按空格切分成list的多个字符串片,已经去除空字符即('')
也可以按其他切割符号分割,还可以指定切割次数
replace() 字符串的替换
从左到右替换指定的元素,可以指定替换的个数,默认全部替换
strip 字符串标准化
默认去除两边的空格、换行符之类的,去除内容可以指定
upper、lower、capitalize字符串的变形
upper 英文全大写
lower 英文全小写
capitalize 英文首字母大写
字符串的格式化输出
name = 'Molly'
hight = 170.4
score_math = 95
score_english = 89
#C语言风格——适合老程序员(无苦入门)
print('大家好!我叫%s,我的身高是%d cm, 数学成绩%d分,英语成绩%d分' % (name, hight, score_math, score_english))
#python3,6之前的格式化风格
print('大家好!我叫{:s},我的身高是{:d} cm, 数学成绩{:d}分,英语成绩{}分'.format(name, int(hight), score_math, score_english))
#python3.6之后新增的可读性最强的风格(推荐萌新掌握)
print(f"大家好!我叫{name},我的身高是{int(hight)} cm, 数学成绩{score_math}分,英语成绩{score_english}分")
注意 f 别忘啦
list进阶
list索引、切片、count 计数 、 index查找
操作与字符串一样
添加新元素
- append(value)——末尾添加元素
- insert(index,value)——在指定位置添加元素,如果指定的下标不存在,那么就是在末尾添加
- list1.extend(list2) ——合并两个list
删除元素
pop() 默认弹出删除末尾的元素,也可输入参数弹出指定位置的元素
remove() 指定删除元素
列表生成式
通过一个list简洁地衍生出所需的list
[…for…]
1.通过基于for表达式
list1 = ['a','b','a','d','a','f']
[f'app_{n}' for n in range(10)]
2.再由if进行list过滤
list_1 = [1,2,3,4,5]
[n for n in list_1 if n%2==0]
3.双重循环(可忽略,几乎用不到)
生成器(适用大数据)
通过列表生成式,我们可以直接创建一个列表。但是,受到内存限制,列表容量肯定是有限的。而且,创建一个包含100万个元素的列表,不仅占用很大的存储空间,如果我们仅仅需要访问前面几个元素,那后面绝大多数元素占用的空间都白白浪费了。
第一种方法:类似列表生成式
(…for…)
g = (x * x for x in range(10))
next(g)
第二种方法:基于函数
def factor(form):
yield
函数
是组织好的,可重复使用的,用来实现单一,或相关联功能的代码段
- 函数代码块以 def 关键词开头,后接函数标识符名称和圆括号()。
- 任何传入参数和自变量必须放在圆括号中间。圆括号之间可以用于定义参数。
- 函数的第一行语句可以选择性地使用文档字符串—用于存放函数说明。
- 函数内容以冒号起始,并且缩进。
- return [表达式] 结束函数,选择性地返回一个值给调用方。不带表达式的return相当于返回 None。
函数是支持多个返回值的,返回类型是 tuple 元组
可用 x,y = f(x) 来获取相应返回值——这和元组赋值是一致的即 x,y = (1,2)
参数传递
函数的参数分这五类:位置参数,缺省参数,可变参数,关键字参数,命名关键字参数
位置参数 a,b
位置参数是最简单的一种函数调用的方式。位置参数须以正确的顺序传入函数、数量必须和声明时的一样。
缺省参数 =default
调用函数时,缺省参数的值如果没有传入,则被认为是默认值。
可变参数 *x
可变参数就是传入的参数个数是可变的,可以是1个、2个到任意个,还可以是0个。
可变参数允许你传入0个或任意个参数,这些可变参数在函数调用时自动组装为一个tuple(元组)。
关键字参数 **x
关键字参数允许你传入0个或任意个含参数名的参数,这些关键字参数在函数内部自动组装为一个dict(字典)。
命名关键字参数 *,x,y
如果要限制关键字参数的名字,就可以用命名关键字参数
规范限定参数,更新API时检查错误使用!
在Python中定义函数,可以用必选参数、默认参数、可变参数、关键字参数和命名关键字参数,这5种参数都可以组合使用。
但是请注意,参数定义的顺序必须是:位置参数、缺省(默认)参数、可变参数、命名关键字参数和关键字参数。
PS:建议不要多组合
lambda匿名函数
lambda 只是一个表达式,函数体比 def 简单很多。
lambda 的主体是一个表达式,而不是一个代码块。仅仅能在 lambda 表达式中封装有限的逻辑进去。
lambda 函数拥有自己的命名空间,且不能访问自有参数列表之外或全局命名空间里的参数。
举个例子:add = lambda arg1, arg2: arg1 + arg2
高阶函数
map / reduce
map()函数接收两个参数,一个是函数,一个是Iterable,map将传入的函数依次作用到序列的每个元素,并把结果作为新的Iterator返回
reduce: 用传给 reduce 中的函数 function(有两个参数)先对集合中的第 1、2 个元素进行操作,得到的结果再与第三个数据用 function 函数运算,依此类推,最后得到一个结果。
from functools import reduce
# 从python3开始,reduce函数移动到了functools这个包,每次使用前要先import
排序函数sorted
排序也是在程序中经常用到的算法。无论使用冒泡排序还是快速排序,排序的核心是比较两个元素的大小。如果是数字,我们可以直接比较,但如果是字符串或者两个dict呢?直接比较数学上的大小是没有意义的,因此,比较的过程必须通过函数抽象出来。默认是从小到大排列,可以通过reserve参数(布尔型)改变排列
装饰器
函数可以作为返回值!!
装饰器最大的优势是用于解决重复性的操作,其主要使用的场景有如下几个:
- 计算函数运行时间
- 给函数打日志
- 类型检查
当然,如果遇到其他重复操作的场景也可以类比使用装饰器
def print_working(func):
def wrapper():
print(f'{func.__name__} is working...')
func()
return wrapper
@print_working
def worker1():
print('我是一个勤劳的工作者!')
通过语法糖@装饰器名可以简单的调用
闭包
python中的闭包从表现形式上定义(解释)为:如果在一个内部函数里,对在外部作用域(但不是在全局作用域)的变量进行引用,那么内部函数就被认为是闭包(closure).
返回闭包时牢记一点:返回函数不要引用任何循环变量,或者后续会发生变化的变量。
偏函数
通过设定参数的默认值,降低函数调用的难度
from functools import partial
f_n = partial(x,y,z=default)
模块导入
import numpy as np
import pandas as pd
安装/卸载第三方模块
pip install / uninstall
conda install / uninstall
为了创建数据和函数的直接联系,利于维护代码就引入类的概念
类
构造方法、实例化、类属性、类方法、私有化
创建一个类
格式如下:
class 类名:
def __init__(self):
#类体
…
其中,__init__是构造方法,用于初始化成员变量
其余的可以是实例方法、类方法
方法的定义参数的规则和函数是一致的只不过前面要加上self,
实例化
对象名 = 类名(参数) #self是不写的
类方法
方法定义时,使用@classmethod标记
调用:
类名.类方法
对象.类方法
私用的属性和方法
在属性和方法名前加 __ 两个下划线
继承
创造一个具有原先存在类的所有内容的类
我们将原来的类称作父类,继承下来的类成为子类
定义
class 子类名(父类名):
①子类新增属性,需写__init__构造方法,调用父类__init__即:
class Father:
def __init__(self,x,y):
self.x = x
self.y = y
class Child(Father):
def __init__(self,x,y,z):
Athlete.__init__(self,x,y)
self.z = z
②子类没有新增属性可省略构造方法
使用:
对象名 = 子类名(参数)
继承的好处:
代码重用,升级功能(重写),新增功能(新的方法)
重写
子类方法与父类方法完全相同,子类若重写了父类的方法,则子类对象调用方法时就是调用的自己类中重新的方法。
多继承
python是支持有多个父类
注意:多个父类有相同的属性或方法名,这种情况应该避免