1、if 选择结构 :
if ... elif ... else
格式:
if 表达式1:
代码块1(缩进)
代码块2(缩进)
代码块3(缩进)
elif 表达式2:
代码块4(缩进)
代码块5(缩进)
代码块6(缩进)
else:
代码块7(缩进)
代码块8(缩进)
例 :
age = int(input("请输入年龄:"))
if age <= 0 | age >= 150:
print("成精了...")
elif age >= 18:
print("成年...")
elif age < 18:
print("未成年...")
else:
print("未知")
2、循环结构 :
Python中为了语法简洁, 没有do...while
(1)for循环
格式:
1)sum = 1
for i in tuple: # 表示将元组(a,b,c) 中的值一个一个取出赋值给i
sum *= i
print(sum)
2)for i in range(n): # 表示将集合n的值一个一个取出,再赋值给i
执行语句
(2)while循环
格式:
while(表达1):
代码块(缩进)
代码块(缩进)
代码块(缩进)
例 : 求阶乘
5! = 5 * 4 * 3 * 2 * 1
res = 1
n = 5
while (n >= 1): # 5 4 3 2 1
res *= n # 5 *4 *3 *2 *1
n -= 1
print(res)
3、连接MySQL
-- Java使用Maven (因为默认连接的是外网,所以需要配置一个文件)
-- Python使用pip (同理,默认连接的也是外网,所以需要将配置好的pip文件夹放在 C:\Users\hp )
pip使用 :
点击Pycharm底部Terminal -> 输入 : pip --help 查看pip中所有命令
-> 输入 : pip list 查看pip已安装的模块
-> 输入 : pip install pymysql 安装pymysql
此时若出现版本太低请更新,输入 : python -m pip install --upgrade pip 更新版本
-> 输入 : pip uninstall pymysql 删除pymysql
java连接数据库:
(1)加载驱动
(2)获取连接
(3)获取执行器
(4)获取结果集
(5)关闭
Python连接数据库:
(1)导包 : import pymysql
(2)获取连接 : pymysql.connect(user='root',password='123456',host='192.168.71.200',database='shujia',port=3306)
(3)获取游标 : cursor = conn.cursor()
(4)获取数据 : 获取表中第一条数据
print(cursor.fetchone())
获取表中五条数据 (由于上一条语句,游标已指向了第2行语句,所以取值从第2行语句开始)
print(cursor.fetchmany(5))
获取表中全部数据 (同上,从第7行开始)
print(cursor.fetchall())
或:
res = cursor.execute("select * from emp") # 获取到表中所有行信息
for i in range(res):
print("获取到一行数据: " ,cursor.fetchone()) # 将获取到的所有信息输出
(5)手动关闭 : cursor.close()
conn.close()
with as 用法 -- 为了防止开发者忘记关闭连接
with pymysql.connect(user='root', password='123456', host='192.168.71.200', database='shujia', port=3306) as conn:
with conn.cursor() as cursor:
res = cursor.execute("select * from emp where ENAME like %s", ('M%'))
for i in range(res):
print(cursor.fetchone())
-----------------------------------------------------------------------
Linux连接数据库步骤 : mysql -uroot -p123456 连接数据库
show databases; 显示所有的数据库
use shujia; 切换到shujia数据库
show tables; 显示所有的表
select * from emp; 查询emp
Ctrl z 退出
-----------------------------------------------------------------------
4、IO
通过 open() 方法。
encoding错误:
UnicodeDecodeError: 'gbk' codec can't decode byte 0x90 in position 19: illegal multibyte sequence
解决方法:
encoding='utf8'
(1) mode='r' 只读模式 (输出所读的数据)
f1 = open(file="D:\wang\PycharmProjects\pythonProject\data\students.txt", mode='r', encoding='utf8')
print(f1.read(15)) # 获取当前行15位数据
print(f1.readline()) # 获取当前游标下的整行数据
print(f1.readline())
print(f1.readlines()) # 获取当前下标后的所有数据
f1.close()
(2) mode='w' 写入模式 (创建一个新的文件,并将数据写入,每一次写入都会覆盖原来的内容)
f2 = open(file="D:\wang\PycharmProjects\pythonProject\data\write.txt", mode='w', encoding='utf8')
f2.writelines("输入一行数据: 111\n")
f2.writelines("输入一行数据: 222\n")
f2.writelines("输入一行数据: 333\n")
f2.write("输入数据完毕...")
f2.close()
(3) mode='a' 追加数据 (在指定文件最后追加数据)
f2 = open(file="D:\wang\PycharmProjects\pythonProject\data\write.txt", mode='a', encoding='utf8')
f2.writelines("再输入一行数据: 888\n")
f2.write("输入数据完毕...")
f2.close()
with as :
需求1 : 从students.txt 中读取数据并写入 students_new.txt
with open(file="D:\wang\PycharmProjects\pythonProject\data\students.txt", mode='r', encoding='utf8') as f3: # 表示读取到数据
with open(file='D:\wang\PycharmProjects\pythonProject\data\students_new.txt', mode='w', encoding='utf8') as f4: # 表示创建了新文件
f4.writelines(f3.readlines()) # 写入数据(读取到的数据)
需求2 : 从write.txt 中读取数据并追加到 students_new.txt
with open(file="D:\wang\PycharmProjects\pythonProject\data\write.txt", mode='r', encoding='utf8') as f5:
with open(file="D:\wang\PycharmProjects\pythonProject\data\students_new.txt", mode='a', encoding='utf8') as f6:
f6.writelines(f5.readlines())
5、function 函数
(1)函数
格式:
def 函数名(参数1, 参数2, 参数3):
代码块(缩进)
代码块(缩进)
代码块(缩进)
# 若需要返回值
return 数据
# 先定义一个方法求两数之积
def chengfa(a, b):
print(a * b)
# 再调用方法
chengfa(3, 4)
(2)递归函数
1)需要调用自己
2)需要有一个停止标记 : return 1
# 求5的阶乘
def jiecheng(n):
if n == 1:
return n
else:
return n * jiecheng(n - 1)
jiecheng(5)
6、 函数的参数
划分:
(1) 位置参数
(2) 默认参数
(3) 可变参数
(4) 关键字参数
(5) 匿名函数 -- 很不常用
(1) 位置参数
1) 位置参数可包含多个
2) 函数调用时位置参数不能为空
def chengfa(a, b):
print(a * b)
chengfa(2) # 报错,因为需要两个位置参数,b不能为空
(2) 默认参数
1) 定义函数的时候,需要去指定参数的默认值
2) 使用时,可通过再次传入参数值进行覆盖默认值
def chengfa(a, b = 0):
print(a * b)
chengfa(3) # 默认 b = 0
# 也可以传值覆盖默认值:
chengfa(3, 4)
(3) 可变参数
1) 可变参数的写法需要在参数名之前加一个*如 : *args ,表示参数个数是可变的
2) 可变参数实际是一个tuple(元组 : (x,v,z)
def chengfa(*args):
print(args, type(args))
chengfa(2, 3, 4, 5) # 输出结果: (2, 3, 4, 5) <class 'tuple'>
# 想要做运算 :
def chengfa(*args):
sum = 1
for i in agrs:
sum *= i
print(sum)
chengfa(2, 3, 4, 5)
(4) 关键字参数
1) 定义参数时需要用 **参数名 表示关键字参数 如 :**kwargs
2) 类型是一个字典类型(k,v)
3) 传入时需要按照 k = v 形式进行传入
4) 可以接收多个 kv 参数
def info(name, age, **kwargs):
print(name, age, kwargs)
# 可以传入单个关键字参数
info("昭阳", 18, sex = "男")
# 也可以传入多个关键字参数
info("昭阳", 18, sex = "男", play = "LOL") # 昭阳 23 {'gender': '男', 'play': 'LOL'}
# 判断传入参数有没有age 如果有就打印,没有就提示:请输入age
# 因为是字典类型,可以通过 dict.keys() 获取到所有的 key
# 字典取值 : dict["x1"]
def info2(name, **kwargs):
if ('age' in kwargs.keys()): # 获取所有的key判断age存在
print("age: ", kwargs["age"]) # 取出key为age对应的值
else:
print('请输入age')
info2(name="lisi") # 请输入age
info2(name="wangwu", age=3) # age: 3
(5) 匿名函数
# 获取x的y次方
lambda_function = lambda x, y: x ** y
print(lambda_function(2, 3))
7、 面向对象
(1)封装 -- 不严格
(2)继承
(3)多态 -- 不严格
(1)封装
# 定义一个类
# 创建构造方法(__init__修饰)
# self : 类本身的 (等价于java中的 this ) self.属性名 : 获取对应的属性
# 属性名前加上 __ : 表示私有的 ( private)
# 重写__str__方法 (重写toString方法)
# 可以定义方法 ,可以访问私有属性
结论: Python中没有严格的封装概念
calss Person:
def __init__(self, name, age):
self.name = name
self.age = age
self.__job = "超人" # 表示私有的
def __str__(self):
return "Person : " + self.name + " , " + str(self.age)
def show(self):
print(self.name + "可以开飞机。。。")
print(self.__jod) # 方法可以直接访问私有属性
# 构建定义类的对象 (不需要java中的 new )
person = Person("昭阳", 20)
print(person) # Person的地址,需要重写toString方法 --> 对应Python中的__str__ --> Person : 昭阳 , 20
print(person.name) # 昭阳
print(person.age) # 20
person1.show()
print(person1._Person__job) # 内部私有属性可以通过 对象名._类名__内部私有属性名 进行访问
(2)继承
1.如果一个新的类继承了已有的一个类,那么被继承的类叫 父类,新的类叫做子类
2.范围大的一般被用来做父类,具体的一般用来做子类
3.子类可以调用父类中的方法及属性
4.如果子类中的函数与父类重名,则调用子类方法
# 创建一个 Teacher 类去继承 Person 类
# 如果需要创建父类对象,需要传入父类构造方法中所需的参数,并且super中需要传入子类名称及其self
class Teacher(Person):
def __init__(self, t_name, t_age, teach):
super(Teacher, self).__init__(name=t_name, age=t_age)
self.teach = teach
def __str__(self):
return "Teacher: " + self.name + " , " + str(self.age) + " , " + self.teach
def skill(self):
print("可以搞大数据...")
# 创建Teacher类对象
# 能调用子类方法(skill),也能调用父类方法(show)
teacher = Teacher("杨老师", 30, "LOL")
print(teacher)
teacher.skill()
teacher.show()
(3) 多态
1.可以通过对象的引用调用其方法
2.父类应用指向子类对象
3.通过run方法 ,得出结论: Python中并不注重是否继承及检查类型,只注重有没有方法及属性
def run(person): # 变量person可以根据调用类型变为指定类型
person.skill()
person3 = Person("王", 40)
run(person3)
teacher3 = Teacher("覃老师", 28, "王者")
run(teacher3)
class Duck:
def skill(self):
print("鸭子可以游泳...")
# run()方法中定义的是person,却可以在这里使用
# 结论 : Python中并不注重是否继承及检查类型,只注重有没有方法及属性
duck1 = Duck()
run(duck1)
# 猴子补丁
思路:
创建一个类,但没有给出方法
调用者需要用到方法时,自己加方法
class Dog:
pass
# 创建一个匿名函数
skill_function = lambda: print("是人是狗都在秀...")
# 创建Dog对象
dog = Dog()
# 将匿名函数的值赋给dog作为Dog新增的补丁方法
dog.show = skill_function
dog.show() # 是人是狗都在秀...
8、模块
一个项目结构 : 代码 -> 函数 -> 类 -> 模块 -> 包
特点:
1.导入模块时,会去执行模块中的代码块,输出规定的语句 (ModelA中 : print(hello) -> 输出A 、 调用方法 print_hello() -> 输出this is ModelA..)
2.模块的两种导入方法 import ... 和 from 包 import ...
3.若模块中方法不调用就不会输出 ; 也可以像导入模块一样导入方法,这样就不需要在模块中调用方法了
右击项目名 -> New Python Package -> 创建包。
import model.ModelA # A this is ModelA..
from model import ModelB # B
# 导入方法
from model.ModelB import print_hello
print_hello() # this is ModelB..
# 可以在导入模块时,用 as 起别名
import model.ModelA as MA
MA.print_hello() # this is ModelA..
9、异常
六大常见异常:
(1) 除零错误 : ZeroDivisionError 除数为0
(2) 关键词错误 : NameError 没有定义直接使用
(3) 值错误 : ValueError 某些函数或者方法只适用于特定的数据类型,如果 对数据类型的操作不当,就会产生类型错误
(4) 索引错误 : IndexError 超出索引取值范围
(4) 属性错误 : AttributeError 调用不合适的方法或属性
(5) 缩进错误 : IndentationError 没有按规定进行缩进(高版本有优化)
(1) 除零错误 ZeroDivisionError
# print(10 / 0)
(2) 关键词错误 NameError
# prin("hello")
(3) 值错误 ValueError
b = "abc"
# print(int(b))
print(b)
(4) 索引错误 IndexError
list = [1, 2, 4]
# print(list[4])
(5) 属性错误 AttributeError
tuple = (1, 2, 3)
# 元组不可修改,所以调用追加方法属于调用不当
# tuple.append(1)
(6) 缩进错误 IndentationError
for i in range(1, 4):
# print(i) # 少缩进一格
print(i)
捕获异常:
try:
可能出现问题的代码块
可能出现问题的代码块
可能出现问题的代码块
except 捕获异常种类1 as 起别名:
出现异常种类1,执行...
except 捕获异常种类2 as 起别名:
出现异常种类2,执行...
else:
没有发生异常可以执行...
finally:
不管有没有错误都执行...
特点:
(1)当出现多个错误时,以程序运行顺序先捕获到的错误为主
(2)当捕获异常时,如果出现较大范围的异常类型时,以较大范围的异常为主(注:异常存在继承关系,最大为 Exception)
10、 Numpy 做科学计算的,做大数据几乎不会遇到
处理多维矩阵
jupyter notebook 可视化工具
安装:
下面的 Terminal 输入 : pip install numpy -> 安装numpy(一个针对于矩阵的开源python)
再输入 : pip install jupyter notebook -> 安装jupyter notebook (类似可视化工具)
使用jupyter notebook:
下面的 Terminal 输入 : jupyter notebook 回车 -> 会跳转到一个网页
新建文件夹 : New -> Folder -> 勾选中左边的框会出现Rename和Move等操作 -> 点击Rename改名字 -> 改名为: notebooks -> 点击notebooks可以进入。
新建笔记本 : New -> Python 3 -> 导包 : import numpy as np -> 点击 运行 -> 输入 : data = [[1, 2, 3], [4, 5, 6]] np_arr = np.array(data)
-> 点击 运行 -> 输入 : np_arr -> 点击 运行 -> 会显示矩阵所有内容
输入 : np_arr.max() 显示矩阵最大值
np_arr.min() 显示矩阵最小值
np_arr.mean() 显示矩阵元素平均值
np_arr.sort() 将矩阵排序 -> np_arr -> 点击 运行 -> 显示排序后的矩阵
...
np_arr.astype(int) 会将矩阵字符类型数据转换成int类型
索引 :
(1) 单个索引默认按行读取数据 np_arr[1] : 取矩阵第2行数据
(2) 切片取行 [a:b] 范围[a,b) np_arr[:2] : [0,2) 表示取矩阵第1、2两行
加步长 np_arr[::2] : 从第1行开始,每隔一行取一个
(3) 切片取列 [[a:b],[a:b]] 范围[[a,b),[a,b)] np_arr[:2,:2] : [[0,2),[0,2)] 表示取矩阵第1、2行的第1、2列
可以取某个确定的值 np_arr[1:2,1:2] : 取(1,1)的值
(4) 切片取对角线的值 np_arr[(0,1,2),(0,1,2)] : 前()为列,后()为行 取(0,0)、(1,1)、(2,2)三个值
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
小技巧: 列编辑模式
Notepad中, 数字排成一排, 按住Alt,鼠标从开始数字拉到要停止数字,再输入1(想输几就输几) --> 所有被选中数字前面都加上了1
或者按删除键 --> 都会一起删除
1
2
3
4
5
6
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>