Python 基础2

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

>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>

  • 9
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值