我的编程空间,编程开发者的网络收藏夹
学习永远不晚

Python基础入门视频课程——笔记

短信预约 -IT技能 免费直播动态提醒
省份

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

Python基础入门视频课程——笔记

视频课程链接:http://edu.51cto.com/course/14859.html
Python基础入门视频课程——笔记

一、Python简介

1. Python是什么?

​ Python是一种面向对象的解释型计算机程序设计语言,由荷兰人Guido van Rossum(龟叔)于1989年发明,第一个公开发行版发行于1991年。

​ 诞生:1989年圣诞节期间,在阿姆斯特丹,Guido为了打发圣诞节的无趣,决心开发一个新的脚本解释程序,即Python(TIOBE编程语言排行榜)

​ 作用:开发网站、后台服务、工具脚本、爬虫、数据分析、人工智能等

​ 特点:

  • 优点:简单(定位:简单、优雅、明确)、代码量少(人生苦短 我用python)、功能强大(大量的第三方库)
  • 缺点:运行速度慢、代码不能加密
  • 补充:Python是一门解释型语言,不需要编译,类似于PHP,不同于Java、C#等编译型语言

2. 安装Python

​ Python是跨平台的,执行Python代码需要解释器

​ 版本:2.x、 3.x

​ 安装步骤:

  • Windows

  • Linux

    mkdir python # 创建Python的安装目录
    
    tar zxf Python-3.6.5.tgz # 解压缩
    cd Pyton-3.6.5
    ./configure --prefix=/home/soft01/python  # 配置,指定安装位置
    make # 编译
    make install # 安装
    
    cd /home/soft01/python/bin
    ./python3
    
    # 将python路径添加到PATH变量中
    vi ~/.bashrc
    export PATH=/home/soft01/python/bin:$PATH
    source ~/.bashrc

二、第一个Python程序

1. 使用Python交互模式

​ 执行python命令,就进入Python交互模式,提示符>>>,输入exit()退出交互模式

>>> 3+8
11
>>> print('Hello World')
Hello World
>>> name='tom'
>>> print(name)
tom
>>>exit()

2. 使用文本编辑器

​ 建议使用sublime或notepad++等,不要使用windows自带的记事本(会自动在文件的开头添加特殊字符)

​ 步骤:

  1. 创建Python脚本文件,以.py结尾

    # -*- coding: utf-8 -*-
    # 这是注释,第一个Python程序
    
    print('Hello World')
    name='唐伯虎'
    print(name)

    注:如果脚本中有中文,可能会报错,需要在文件的第一行添加一个特殊的注释

  2. 运行脚本

    python hello.py
  3. 直接执行脚本

    在Linux和Mac中可以直接执行.py脚本文件,方法:

    • 在文件的第一行添加一个特殊的注释:#!/usr/bin/env python3
    • 为文件添加执行权限:chmod a+x hello.py
    • 直接执行脚本文件:./hello.py

3. 使用IDE工具

​ PyCharm,JetBrain公司出口

​ 使用步骤:

  1. 创建包

    包中必须存在一个__init__.py文件,用于标识这是一个包

  2. 创建Python脚本

    #!/usr/bin/env python3
    # -*- coding: utf-8 -*-
    __author__ = '汤小洋'
    
    # 输出,使用print()
    print('hello world')
    name = 'alice'
    print(name)

4. 基本使用

​ 输入和输出

  • 使用print()
  • 使用input()

​ 注释:

  • 单行注释,以#开头
  • 多行注释,使用三对单引号或三对双引号

​ 编码规范:

  • 不要在行尾加分号
  • 大小写敏感
  • 适应添加空格、空行,使代码布局更优雅、美观、合理
  • 使用缩进来表示代码块

三、Python基础

1. 变量和数据类型

​ 变量:

  • 定义变量时不需要指定变量的类型,直接为变量赋值即可
  • 变量名要符合命名规范

​ 数据类型:整型、浮点型、字符串、布尔、空值等

#!/usr/bin/env python3
# -*- coding: utf-8 -*-
__author__ = '汤小洋'

'''
   数据类型:整型、浮点型、字符串、布尔、空值等
'''
# 整型int
a = 3454566666666666666
print(a)
print(type(a))

# 浮点型float
b = 12.5
print(b, type(b))

# 字符串str,定义字符串可以使用单引号或双引号(推荐用单引号)
c = 'ccc'
d = "ddd"
print(c, type(c))

print('张三说:"今晚吃鸡吗?"')

# 字符串有多行时可以使用三对单引号,表示多行内容
e = '''
welcome 
    to
        itany    
'''
print(e)
print(type(e))

# 布尔bool,取值:True、False
f = True
print(f, type(f))

g = 5 < 3
print(g)

print(5 + False)  # True表示1,False表示0

# 空值 NoneType
h = None
print(h, type(h))

2. 字符串

​ 类型转换

# 将字符串转换数值
a = '25'
b = int(a)
print(type(a), type(b))
c = '12.5'
d = float(c)
print(type(c), type(d))
# 将数值转换为字符串
print('hello ' + str(25))  # 数值类型不能直接和字符中进行拼接,需要进行类型转换

​ 字符串常用方法

string = '  hello world '
print(string.islower())
print(string.isupper())
print(string.capitalize())
print(string.index('llo'))
print(string)
print(string.strip())  # 类似于java中的trim
print(len(string))  # 调用len()函数获取长度

​ 切片

name = 'tom cruise'
print(name[0])
print(name[4], name[len(name) - 1], name[-1])
print(name[1:5])  # 获取索引为[1,5)的字符
print(name[:5])  # 表示从头获取
print(name[2:])  # 表示获取到末尾
print(name[1:8:2])  # 索引为[1,8)的字符,每两个取一个
print(name[::2])  # 所有字符,每两个取一个

​ 格式化

# 格式化字符串,在字符串中指定占位符
# 方式1:使用%运算符,%s表示任意字符,%d表示整数,%f表示浮点数
name = 'tomaaaa'
age = 20
height = 180.5
print('大家好,我叫' + name + ',年龄:' + str(age) + ',身高:' + str(height))
print('大家好,我叫%2.4s,年龄:%d,身高:%.2f' % (name, age, height))  # 2.4s表示字符串长度为2-4位,.2f表示保留两位小数
print('当前时间:%d年-%02d月-%d日' % (2018, 5, 14))  # 指定月份为两位,不足两位则补0

# 方式2:使用format()方法,使用{}表示占位符
print('大家好,我叫{0},年龄:{1},身高:{2:.2f}'.format(name, age, height))
print('大家好,我叫{name},年龄:{age},身高:{height}'.format(age=age, name=name, height=height))

# 方式3:在字符串前面添加一个f,使用{变量名}来嵌入变量
print(f'大家好,我叫{name},年龄:{age},身高:{height}')

3. 运算符

​ 算术运算符、比较运算符、赋值运算符、逻辑运算符、位运算符、条件运算符、成员运算符、身份运算符

#!/usr/bin/env python3
# -*- coding: utf-8 -*-
__author__ = '汤小洋'

'''
Python中支持的运算符:
1.算术运算符
    + - * / % // **
    不支持自增++和自减--
2.比较运算符
    > < >= <= == !=或<> 
3.赋值运算符
    = += -= *= /+ %= **=
4.逻辑运算符
    and  or  not
5.条件运算符,也称三目运算符
    语法:条件为真时的结果 if 条件 else 条件为假时的结果  
6.位运算符
    与& 或| 非~  异或^ 左移<<  右移>>
7.成员运算符
    in 
    not in
8.身份运算符
    is 
    is not

'''

# 1.算术运算符
print(3 + 5)
print(3 * 5)
print(30 * '-')  # 乘法可以用于字符串
print(5 % 3)
print(5 / 3)  # 除法,有小数
print(5 // 3)  # 除法,取整
print(2 ** 3)  # 幂
print(pow(2, 3))
i = 5
i = i + 1
print(i)
print('*' * 80)

# 2.比较运算符
j = 5
print(j > 2)
print(10 > j > 1)  # 支持此写法
print('abc' > 'acd')  # 可以用于字符串的比较,比较的是字符串的Unicode编码

# 3.赋值运算符
a = 10
a += 5  # 等价于a= a+5
print(a)

# 4.逻辑运算符
print(True and False)
print(5 > 2 or 4 < 1)
print(not 5 > 2)

x = 0  # 0 表示False,非0表示True
y = 8
print(x and y)  # 如果x为True,则返回y;否则返回x
print(x or y)  # 如果x为True,则返回x;否则返回y
print(not x)  # 如果x为True,则返回False,否则返回True

# 5.条件运算符,也称三目运算符
print('aaa' if 5 < 2 else 'bbb')

# 6.位运算符
a = 5  # 00000101
b = 8  # 00001000
print(a & b)  # 两位都是1才为1,否则为0
print(a | b)  # 只要有一位为1,则为1,否则为0
print(~a)  # 如果为1,则为0,如果为0,则为1
print(a ^ b)  # 如果两位相同,则为0,不同为1
print(b >> 2)  # 二进制的所有位都向右移2位

# 7.成员运算符
c = [3, 5, 12, 15, 7, 2]
d = 5
print(d not in c)

# 8.身份运算符
m = [1, 3, 5, 7]
n = [1, 3, 5, 7]
x = n
print(m is n)
print(x is n)

'''
    is 和 == 的区别
    is 判断两个变量是否引用同一个对象
    == 判断两个变量的值是否相等
'''
print(m == n)

4. 列表和元组

​ 列表list是一种有序的集合,用来存储多个值,可以向列表中添加或删除元素

​ 元组tuple与list很类似,也是用来存储多个值,但tuple中的元素只能在定义时初始化,初始化后就无法再修改

​ 总结:列表list和元组tuple都是Python内置的一种集合,一个可变的,一个是不可变的

# ---列表list
# 定义列表,使用[]
names = ['tom', 'jack', 'alice', 'mike']
print(names)
print(type(names))

# 获取/设置元素
print(names[1], names[:3])
names[0] = 'lucy'
print(names)

# 追加元素
names.append('zhangsan')

# 在指定位置插入元素
names.insert(1, 'lisi')

# 删除元素
names.remove('jack')

# 弹出元素
print(names.pop(0))

# 获取元素个数
print(len(names))

# 可以存储不同类型的数据
names.append(25)  # 不建议
names.append(True)

print(names)
print('-' * 80)

# ------元组tuple
# 定义元组,使用()
nums = (3, 8, 13, 25, 38, 250)
print(nums)
print(type(nums))

print(nums[2], nums[-1])
print(nums[1:3])

# 解构赋值
# a = nums[0]
# b = nums[1]
# c = nums[2]
# d = nums[3]
# e = nums[4]
# f = nums[5]
a, b, c, d, e, f = nums
print(a, b, c, d, e, f)

5. 条件判断

​ 根据条件进行判断,从而执行不同的操作

​ 使用if...elif...else语句

6. 循环

​ 重复性的执行某个操作,称为循环

​ 两种:

  • while循环
  • for...in循环
# ----while循环
# 计算1到100的和
i = 1
sum = 0
while i <= 100:
    sum += i
    i += 1
print(sum)

# ----for...in循环
names = ['tom', 'jack', 'alice', 'mike']
for name in names:
    print(name, end=',')
print()

# 使用range()函数生成一个序列
for i in range(1, 100, 2):  # 生成一个[1,100)的整数序列,步长为2
    print(i, end=',')
print()

# 计算1到100的和
sum = 0
for i in range(1, 101):
    sum += i
print(sum)

​ break和continue关键字

7. 字典和集合

​ dict全称dictionary,使用键-值(key-value)存储数据,在其他语言中一般称为map

​ set是无序的,不允许重复

# ----字典
# 定义dict,使用大括号{},与js中的json很类似
scores = {'tom': 98, 'jack': 100, 'alice': 60}
print(scores)
print(type(scores))

# 获取
print(scores['jack'])
print(scores.get('alice'))

# 添加/设置
scores['lucy'] = 89
scores['tom'] = 100

# 弹出(删除)
print(scores.pop('tom'))

# 判断是否存在指定的key
print('alice' in scores)

print(scores)

# 遍历
print(scores.keys())
print(scores.values())
print(scores.items())

for k in scores.keys():
    print(k, scores[k])
print('-' * 80)

for v in scores.values():
    print(v)
print('-' * 80)

for k, v in scores.items():
    print(k, v)
print('-' * 80)

# -----set集合
# 定义set,使用大括号{}
# s = {3, 12, 5, 7, 34, 12, 3}
nums = [4, 23, 1, 23, 4, 23]
s = set(nums)  # 调用set()函数将list转换为set,去除重复值
print(s)
print(type(s))

# 添加
s.add(666)
s.add(1)

# 删除
s.remove(1)

print(s)

# 遍历
for i in s:
    print(i)

四、函数

​ 函数是实现特定功能的代码段的封装,在需要时可以多次调用函数来实现该功能

1. 内置函数

​ Python内置了许多非常有用的函数,可以直接调用

2. 自定义函数

​ 语法:

def 函数名(形参1,形参2,...):
    函数体

​ 注意:

  • 函数名可以包含数字、字母、下划线,但不能以数字开头
  • 如果函数有返回值,使用return关键字
  • 定义函数后函数中的代码并不会执行,需要调用函数才会执行
# 定义函数,使用def
def calc(num1, num2):  # 必选参数,也称为位置参数,不能省略
    res = num1 + num2
    return res

# print(calc(3, 5))  # 调用函数

# 参数类型检查
def my_abs(x):
    # 可以为函数添加文档注释,也称为文档字符串doc string
    """
    计算绝对值
    :param x: 参数
    :return: 返回x的绝对值
    """
    # 对参数类型进行检查
    if not isinstance(x, (int, float)):
        raise TypeError('参数类型不正确,只能为数值类型')  # 抛出异常

    if x >= 0:
        return x
    else:
        return -x

# print(my_abs('aaa'))

# print(help(my_abs))

# 默认参数,即有默认值的参数
def my_pow(x, y=2):
    if y == 0:
        return 1
    res = x
    for i in range(y - 1):
        res *= x
    return res

# print(my_pow(5))

# 可变参数,使用*号,表示参数个数是可变的
def my_sum(x, *y):
    print(x)
    print(y)  # 接收到的实际上是一个tuple

# my_sum(3, 5, 8, 12, 4)

# 不建议下面的这种写法,建议将必选参数放在最前面
def my_sum2(*y, x):
    print(y)
    print(x)

# my_sum2(12, 4, 2, 7, x=9)  # 必选参数在后面时需要指定参数名

# 对于可变参数,可以直接传入list或tuple,只需要在参数前添加一个*
nums = [12, 4, 2, 64, 23, 9]

# my_sum(4, nums[0], nums[1], nums[2], nums[3], nums[4], nums[5])
# my_sum(4, *nums)

# 关键字参数,使用**,也表示参数个数是可变的,但传递的是带名称的参数
def f1(x, **y):
    print(x)
    print(y)  # 接收到的实际上一个dict

# f1(3, a=5, b=9, c=18)

# 对于关键字参数,可以直接传入一个dict,只需要在参数前添加**
user = {'id': 1001, 'name': 'tom', 'age': 18}

# f1(4, id=user['id'], name=user['name'], age=user['age'])
# f1(4, **user)

# 命名关键字参数,限制关键字参数的名字,使用*分隔,*号后面的参数表示命名关键字参数
def f2(x, *, name, age):
    print(x)
    print(name)
    print(age)

# f2(4, name='alice', age=20)

# 接收任意参数
def f3(*args, **kwargs):
    print(args)
    print(kwargs)

f3(1, 43, 'aaa', name='alice', age=20)
# 空函数,表示以后再实现
def empty():
    pass  # 使用pass

# 函数的返回值,返回多个值
def f1():
    name = 'tom'
    age = 20
    sex = 'male'
    return name, age, sex

# print(f1())  # 返回值实际上是一个tuple
a, b, c = f1()

# print(a, b, c)

# 函数的返回值,返回一个函数,即将函数作为返回值
def f2(x):
    print(111)
    z = 6

    def f3(y):
        print(x * y + z)  # 内部函数使用了外部函数的参数或局部变量,称为闭包

    return f3

# fn = f2(3)
# fn(5)

# 递归函数:一个函数在内部调用自身,这个函数就是递归函数
# 计算x的y次方,如计算2的5次方
def calc(x, y):
    # 常规方式
    # if y == 0:
    #     return 1
    # i = 1
    # res = x
    # while i < y:
    #     res *= x
    #     i += 1
    # return res

    # 递归方式
    # 2*2*2*2*2=2*(2*2*2*2)=2*(2*(2*2*2))=
    if y == 0:
        return 1
    else:
        return x * calc(x, y - 1)  # 不停的调用自己,递归太深可能会抛出栈溢出异常

print(calc(2, 99999999999999))

3. 变量作用域和命名空间

'''
变量作用域scope:指的是变量生效的区域

两种作用域:
1.全局作用域
    函数以外的区域都是全局作用域
    在全局作用域中定义的变量,都是全局变量
2.函数作用域,也称为局部作用域
    函数内的区域,每调用一次函数就会创建一个新的函数作用域
    在函数作用域中定义的变量,都是局部变量

变量的查找顺序:
    先在当前作用域中查找,如果没有则向上一级作用域中查找,直到查找全局作用域,如果还是没有,则报错
'''

a = 5  # 全局变量

if True:
    c = 5  # 全局变量,在Python中没有块级作用域

def fn():
    b = 8  # 局部变量
    print('函数内部:a=', a)
    print('函数内部:b=', b)
    print('函数内部:c=', c)

fn()

print('函数外部:a=', a)
# print('函数外部:b=', b)
print('函数外部:c=', c)

x = 1

def f1():
    x = 2

    def f2():
        x = 3
        print(x)

print('-' * 80)

# global关键字
def fn2():
    # a = 10  # 在函数中为变量赋值时,默认都是为局部变量赋值
    # 如果希望在函数中修改全局变量,要使用global关键字来声明变量
    global a
    a = 10

    print('函数内部:a=', a)

fn2()

print('函数外部:a=', a)
print('*' * 80)

'''
命名空间namespace:指的是变量存储的位置,每一个变量都要存储在指定的命名空间中

每个作用域都有一个对应的命名空间
全局命名空间,用来存储全局变量;函数命名空间,用来存储函数中的变量
命名空间实际上就是一个字典dict,是一个专门用来存储变量的字典
'''

# locals() 获取当前作用域的命名空间
scope = locals()  # 在全局作用域中调用locals(),获取的就是全局命名空间
print(scope)
print(type(scope))

# 通过scope操作命名空间中的变量(不建议)
print(scope['a'])
scope['c'] = 666
scope['z'] = 'tom'
print(scope['c'])
print(scope['z'])
# print(z)
print('*' * 80)

def fn3():
    a = 888
    scope = locals()  # 在函数中调用locals(),获取到的是函数命名空间
    scope['b'] = 222
    print(scope)
    print(scope['b'])

    # globals() 可以在任意位置获取全局命名空间
    global_scope = globals()
    print(global_scope)
    print(global_scope['a'])

fn3()

4. 高级特性

​ 迭代和列表生成式

# 导入模块
import collections

'''
迭代:也称为遍历,循环获取每一个元素
'''

for i in ['tom', 'jack', 'alice']:
    print(i, end=' ')
print()

for i in ('tom', 'jack', 'alice'):
    print(i, end=' ')
print()

for i in {'name': 'tom', 'age': 18, 'sex': 'male'}.keys():
    print(i, end=' ')
print()

for k, v in {'name': 'tom', 'age': 18, 'sex': 'male'}.items():
    print(k, v)

for i in 'hello':
    print(i)

# 判断对象是否是可迭代的
print(isinstance('hello', collections.Iterable))

# 获取索引和值
# 方式1:自己获取索引
names = ['tom', 'jack', 'alice']
for i in range(len(names)):
    print(i, names[i])

# 方式2:使用enumerate()函数,转换为索引-元素对
print(enumerate(names))
print(isinstance(enumerate(names), collections.Iterable))
for k, v in enumerate(names):
    print(k, v)

print('-' * 80)

'''
列表生成式:用来创建list的生成式
'''
# 生成[0,99]的list
# nums = range(0, 100)
nums = list(range(0, 100))  # 转换为list
# print(nums, type(nums))

# print(isinstance(range(0, 100), collections.Iterable))

# for i in range(0, 100):
#     print(i)

# 生成一个包含[1,100]之间所有3的倍数的list
# 方式1
# lst = []
# for i in range(1, 101):
#     if i % 3 == 0:
#         lst.append(i)

# 方式2
lst = [i for i in range(1, 101) if i % 3 == 0]  # 等价于a = list(range(1, 101))
print(lst)

​ 迭代器和生成器

'''
迭代器iterator:用来访问集合元素的一种方式,可以记住迭代的位置
'''

nums = [3, 8, 12, 54, 2, 7]
it = iter(nums)  # 调用iter()函数创建迭代器
print(type(it))

print(next(it))  # 调用next()函数获取迭代器的下一个元素
print(next(it))  # 只能往前不能后退

# 使用for...in循环遍历迭代器
for i in it:
    print(i)

'''
生成器generator:在循环过程中依次计算获取值的对象(节省空间、效率高)
创建生成器的方式:
    方式1:把一个列表生成式的[]改成()
    方式2:在函数中使用yield关键字,此时该函数就变成一个生成器函数
'''
# 方式1:把一个列表生成式的[]改成()
generator = (i for i in range(1, 100))
print(type(generator))  # generator类型

# 获取生成器的下一个值
print(next(generator))  # 获取时才生成值,类似于Oracle中sequence
print(next(generator))
print(next(generator))

# 使用for...in循环遍历生成器
for i in generator:
    print(i)

print('-' * 80)

# 方式2:在函数中使用yield关键字,此时该函数就变成一个生成器函数
def gen():
    print('one')
    yield 13
    print('two')
    yield 8
    print('three')
    yield 25
    print('four')
    yield 38

# 生成器函数与普通函数的执行流程不一样:
# 普通函数是顺序执行,执行到最后一行或遇到return时结束
# 生成器函数是在每次调用next()时执行,遇到yield语句就返回,下一次调用next()时会从上次返回的yield语句处继续执行
g = gen()  # generator类型
print(type(g))
print(next(g))
print(next(g))

# 使用for...in循环遍历生成器
for i in g:
    print(i)

​ 高阶函数

'''
高阶函数:一个函数接收另一个函数作为参数,这种函数称为高阶函数
'''

nums = [12, -4, 3, -23, 65, 1, -234, 22]

# 定义一个函数,用来检查数字是否大于5
def f1(x):
    if x > 5:
        return True
    return False

# 自定义高阶函数,用来过滤列表中的元素
def fn(fun, lst):
    """
    将列表中所有符合条件的元素筛选出来,返回一个新列表
    :param fun: 条件函数
    :param lst: 要进行筛选的列表
    :return: 返回新列表
    """
    new_list = []
    for i in lst:
        if fun(i):
            new_list.append(i)
    return new_list

nums1 = fn(f1, nums)
print(nums1)

def f2(x):
    return x % 2 == 0

print(fn(f2, nums))

# 内置高阶函数 filter(),用于过滤序列
nums2 = filter(f1, nums)
print(list(nums2))

# 内置高阶函数 map(),用于处理序列
def f3(x):
    return x * x

nums3 = map(f3, nums)
print(list(nums3))

# 内置高阶函数 sorted(),用于排序
print(sorted(nums))
print(sorted(nums,key=abs))

​ 匿名函数和装饰器


'''
匿名函数:没有名字的函数,使用lambda关键字
'''

nums = [12, 4, 32, 5, 23, 7]

# def fn(x):
#     return x * 2 + 1

nums_new = list(map(lambda x: x * 2 + 1, nums))
print(nums_new)

# 将匿名函数赋给变量(不建议)
a = lambda x: x + 1
print(a(2))

print('-' * 80)

'''
装饰器:在代码运行期间动态增加功能,称为装饰器Decoration,类似于AOP
'''

# 定义一个装饰器,为函数添加打印日志的功能
def log(fn):
    def wrapper(*args, **kwargs):
        print('开始执行%s()函数。。。' % fn.__name__)
        res = fn(*args, **kwargs)
        print('执行%s()函数结束。。。' % fn.__name__)
        return res

    return wrapper  # 返回装饰函数

@log
def even(lst):
    for i in lst:
        if i % 2 == 0:
            print(i)

@log
def calc(num1, num2):
    res = num1 + num2
    return res

even([12, 34, 2, 5, 34, 21])

print(calc(3, 5))

五、面向对象

1. 定义类

​ 语法:

class 类名:
    类中成员

​ 类中的成员:实例属性、实例方法、类属性、类方法、静态方法等

# 定义一个类,使用class关键字
class Student:
    # pass

    # 类属性:直接在类中定义的属性,可以通过类或实例对象来访问
    hobby = '吃饭'

    # 实例方法:将self作为第一个参数的方法
    def say_hi(self):  # self表示当前类的实例,类似于java中的this
        print('Hi:' + self.name)

    def say_hello(self, username='无名氏'):
        print('Hello:' + username)

    # 类方法:使用@classmethod修饰的方法,将cls作为第一个参数
    @classmethod
    def show(cls, msg):  # cls表示当前类
        print(msg, cls.hobby)

    # 静态方法:使用@staticmethod修饰的方法,没有任何必选参数,不需要将cls作为第一个参数
    @staticmethod
    def show2(msg):
        print(msg, Student.hobby)

# 创建类的对象
stu1 = Student()  # 创建Student类的一个实例
stu2 = Student()
print(stu1, type(stu1))
print(stu2, type(stu2))

a = 3
print(a, type(a))
b = int(5)  # 创建int类的一个实例
c = str('hello')  # 创建str类的一个实例
print(b, type(b))

# 为对象绑定属性
stu1.name = 'tom'  # 实例属性,通过实例对象添加的属性
stu1.age = 20
stu2.name = 'alice'
stu2.sex = 'female'
stu2.height = 180.5
print(stu1.name, stu1.age)
print(stu2.name, stu2.sex, stu2.height)

# 访问实例方法
stu1.say_hi()  # 调用方法时无需传递self,由解析器调用时将对象作为self自动传入
stu2.say_hi()
stu1.say_hello('张三')
stu2.say_hello()

# 访问类属性
print(Student.hobby)
stu1.hobby = '睡觉'  # 为stu1添加了一个实例属性,并不会改变类属性hobby的值
print(stu1.hobby)
print(stu2.hobby)  # 如果当前实例没有hobby属性,则会向上查找类属性hobby

# 访问类方法
Student.show('hello')  # 调用方法时无需传递cls
stu1.show('Hello')
Student.show2('您好')
stu2.show2('你好')

2. 构造方法

__init__() 构造方法,在创建对象时会自动调用,可以用来初始化对象的属性

class Student:

    # 构造方法(函数),不支持重载
    def __init__(self, name, age):
        print('创建对象,执行构造方法。。。')
        self.name = name
        self.age = age

    # 实例方法
    def show(self):
        print('姓名:%s,年龄:%d' % (self.name, self.age))

stu1 = Student('tom', 18)
print(stu1.name, stu1.age)
stu1.show()

3. 封装、继承、多态

​ 封装:隐藏对象中一些不希望被外部所访问到的属性,保证数据的安全

class Student:
    # 定义私有属性
    __age = 18  # 以两个下划线开头,表示对象的隐藏属性,只能在类内部访问

    # 提供getter/setter方法
    def get_age(self):
        return self.__age

    def set_age(self, age):
        # 判断数据是否有效
        if 0 < age < 100:
            self.__age = age
        else:
            self.__age = 18

stu1 = Student()
# print(stu1.__age)  # 在类外部无法访问私有属性
stu1.set_age(28)
print(stu1.get_age())

# 其实Python会把私有属性转为 _类名__属性名(强烈不建议)
print(stu1._Student__age)

​ 继承:使一个类能够获取到其他类中的属性和方法

# 定义一个Person类,父类(超类、基类)
class Person(object):  # 如果省略了父类,则默认父类为object
    def __init__(self, name):
        self.name = name

    def run(self):
        print('person:' + self.name + '正在奔跑。。。')

# 定义一个Student类,子类
class Student(Person):  # 继承自Person
    def __init__(self, name, email):
        # 调用父类的构造方法
        # Person.__init__(name)  # 方式1:直接指定父类的构造方法
        super().__init__(name)  # 方式2:使用super,推荐
        self.email = email

    # 定义子类特有的方法
    def study(self):
        print('student:' + self.name + '正在学习。。。')

    def show(self):
        print('姓名:%s,邮箱:%s' % (self.name, self.email))

    # 重写父类的方法
    def run(self):
        # super().run()  # 调用父类的方法
        print('student:' + self.name + '正在奔跑。。。。')

stu = Student('tom', 'tom@sina.com')
stu.run()  # 调用子类重写后的方法
stu.study()
stu.show()

# 判断一个对象是否是指定类的实例,即判断对象的类型
print(isinstance(stu, Student))
print(isinstance(stu, Person))

# 判断一个类是否是指定类的子类
print(issubclass(Student, Person))
print(issubclass(Student, object))

# object类是所有类的根类,默认所有类都继承自object
print(stu.__doc__)
print(stu.__dict__)

​ 多继承

class A:
    def a(self):
        print('a')

class B:
    def b(self):
        print('b')

class C(A, B):  # 继承多个父类,以逗号隔开
    def c(self):
        print('c')

c = C()
c.a()
c.b()
c.c()

# 类的特殊属性 __bases__ 可以用来获取当前类的所有父类
print(C.__bases__)

​ 多态:多种形态

class Animal:
    def __init__(self, name):
        self.name = name

    def cry(self):
        print('动物在叫。。。。')

class Dog(Animal):
    def __init__(self, name, age):
        super().__init__(name)
        self.age = age

    def cry(self):
        print('狗在叫。。。。汪汪汪')

class Cat(Animal):
    def __init__(self, name, sex):
        super().__init__(name)
        self.sex = sex

    def cry(self):
        print('猫在叫。。。喵喵喵')

# 一个对象可以以不同的形式去呈现,就是多态
def play(animal):
    print(animal.name)
    animal.cry()

dog = Dog('旺财', 2)
cat = Cat('猫咪', '公')
play(dog)
play(cat)

4. 魔术方法

​ 在类中可以定义一些特殊的方法,称为魔术方法

​ 特点:

  • 都是以双下划线开头,以双下划线结尾
  • 不需要手动调用,在特定时机会自动执行
# 定义一个类
class Person(object):

    def __init__(self, name, age):
        print('__init__')
        self.name = name
        self.age = age

    # 将对象转换为字符串时调用,类似于java中的toString()
    def __str__(self):
        return 'Person [name=%s, age=%d]' % (self.name, self.age)

    # 在对象使用len()函数时调用
    def __len__(self):
        return len(self.name)

    # 在对象使用repr()函数时调用
    def __repr__(self):
        return 'hello person'

    # 将对象转换为bool类型时调用
    def __bool__(self):
        return self.age > 18

    # 在对象进行大于比较时调用
    def __gt__(self, other):  # self表示当前对象,other表示要比较的对象
        return self.age > other.age

p1 = Person('唐伯虎', 20)
p2 = Person('秋香', 18)

print(p1)

print(len(p1))

print(repr(p1))

print(bool(p1))

if p1:
    print(p1.name, '已成年')
else:
    print(p1.name, '未成年')

print(p1 > p2)

六、模块

1. 简介

​ 模块化是指将一个程序分解为一个个的模块module,通过组合模块来搭建出一个完整的程序

​ 优点:便于团队开发、方便维护、代码复用

​ 在Python中一个.py文件就是一个模块,创建模块实际上就是创建一个.py文件,可以被其他模块导入并使用

​ 注意:

  • 自定义模块时要注意命名规范,使用小写,不要使用中文、特殊字符等
  • 不要与内置模块冲突

2. 使用模块

​ 导入模块的两种方式:

  • 方式1:import 包名.模块名 [ as 别名]

  • 方式2:from 包名 import 模块名

    ​ from 包名.模块名 import 变量|函数|类

​ 导入模块的代码可以放在任意位置,但一般都放在程序的开头

# 方式1
# import py04_模块.mymodule
# print(py04_模块.mymodule.a)  # 调用模块中的变量
# print(py04_模块.mymodule.plus(3, 5))

# import py04_模块.mymodule as m
# print(m.plus(3, 5))

# 方式2
# from py04_模块 import mymodule
# print(mymodule.b)
# print(mymodule.minus(8, 2))

from py04_模块.mymodule import b, plus, Calculator

# from py04_模块.mymodule import *  # 不建议

# print(b)
# print(plus(2, 5))
# print(Calculator.sum(3, 12, 5))
'''
__name__属性是模块的内置属性,每个模块中都有该属性
当该.py文件是主执行文件,直接被执行时,其值为__main__
当该.py文件是被调用,导入执行时,其值为模块名
'''
# print(__name__)

# 程序入门,类似于Java中的main()方法,只在当直接调用该文件时才会执行,用来执行测试
if __name__ == '__main__':
    print(Calculator.sum(1, 2, 3))

3. Python标准库

​ Python提供了一个强大的标准库,内置了许多非常有用的模块,可以直接使用(标准库是随Python一起安装)

​ 常用的内置模块:

  • sys:获取Python解析的信息
  • os:对操作系统进行访问,主要是对目录或文件进行操作
  • math:数学运算
  • random:生成随机数
  • datetime:处理日期和时间,提供了多个类
  • time:处理时间
import sys
import os
import math
import random
from datetime import datetime, timedelta
import time

print(sys.version)  # Python版本
print(sys.platform)  # 系统平台
print(sys.argv)  # 命令行参数
print(sys.path)  # 模块搜索路径,包含了Python解析器查找模块的搜索路径
print(sys.modules)  # 显示当前程序中引入的所有模块
print(sys.getdefaultencoding())  # 默认字符集
# sys.exit('程序退出') # 退出解析器
print('---------------------------------')

print(os.name)  # 操作系统的类型
print(os.environ['path'])  # 系统的环境变量
print(os.getcwd())  # 当前的目录
print(os.listdir('d:/'))  # 列出指定目录中的内容
# os.system('ping www.baidu.com')  # 执行系统命令
print(os.path.exists('d:/soft'))  # 判断路径是否存在
print('---------------------------------')

print(math.pi)
print(math.ceil(3.4))
print(math.floor(3.4))
print(math.pow(2, 3))
print(math.trunc(2.6))  # 截尾取整
print(round(2.6))
print(round(3.1415925, 3))  # 四舍五入,保留三位小数
print('---------------------------------')

print(random.random())  # 返回[0,1)之间的随机浮点数
print(random.randint(1, 101))  # 返回[1,100]之间的随机整数
print(random.sample([1, 21, 54, 23, 6, 2], 2))  # 从数组中返回随机两个元素
print('---------------------------------')

print(datetime.now(), type(datetime.now()))  # 返回当前时间
print(datetime.strftime(datetime.now(), '%Y-%m-%d %H:%M:%S'))  # 将datetime转换为指定格式的str
print(datetime.strftime(datetime.now(), '%Y{0}%m{1}%d{2} %H:%M:%S').format('年', '月', '日'))
print(datetime.strptime('2018-2-14', '%Y-%m-%d'))  # 将str转换为datetime
print('明天:', datetime.now() + timedelta(days=1))  # timedelta表示两个时间之间的时间差,可以用来进行日间的加减操作
print('前一秒:', datetime.now() - timedelta(seconds=1))
print('---------------------------------')

print(time.time())  # 返回当前时间的时间戳
print(int(time.time()))  # 秒级时间戳
print(int(time.time() * 1000))  # 毫秒时间戳
time.sleep(5)  # 休眠5秒
print(1111)

4. 第三方模块

​ Python社区提供了大量的第三方模块,使用方式与标准库类似

​ 安装第三方模块:

  • 使用包管理工具pip(随Python一起安装的)

    pip install 模块名
  • 使用PyCharm来安装

    Settings——>Project——>Project Interpreter

    报错:AttributeError: module 'pip' has no attribute 'main'

    解决:找到PyCharm安装目录下的helpers/packaging_tool.py文件,替换其中的do_install和do_uninstall函数

    注:官方仓库比较慢,可以使用豆瓣提供的镜像仓库 https://pypi.douban.com/simple/

​ pyecharts是一个用于Echarts图表的类库,便于在Python中根据数据生成可视化的图表

​ Echarts是百度开源的一个数据可视化JS库,主要用来进行数据可视化。

​ 参考:http://pyecharts.org

​ 安装pyecharts库

​ 新版本的pyecharts默认不带地图文件,如果需要使用地图,需要自行安装地图文件包

七、异常处理和IO操作

1. 异常处理

​ 语法:

try:
    可能出现异常的代码
except:
    出现异常后要执行的操作
else:
    不出现异常时执行的操作
finally:
    无论是否出现异常都必须要执行的操作
try:
    print('try...')
    a = 5 / int('abc')
# except:  # 捕获所有异常
# except ZeroDivisionError as e:  # 捕获ZeroDivisionError异常,获取到异常对象
except (ZeroDivisionError, ValueError, Exception) as e:  # 捕获多种异常
    print('出现异常啦', e)
else:
    print('没有异常时执行')
finally:
    print('finally...')

# 自定义异常,继承自Exception(Exception类是所有异常类的父类)
class UsernameExistsException(Exception):
    pass

def fn(username):
    if username == 'admin' or username == 'tom':
        raise UsernameExistsException('用户名已存在')  # 使用raise抛出异常
    else:
        print('ok')

fn(input('请输入用户名:'))

2. IO操作

​ 文件操作

'''
读写模式:
    r  读模式
    w  写模式(覆盖)
    a  追加模式
    r+ 读写模式
    b  二进制模式
'''

# ----读取文件
try:
    f = open('itany.txt', mode='r', encoding='utf-8')  # 打开一个文件,返回一个对象,这个对象就代表着当前打开的文件
    print(f.read())  # 一次性读取所有内容
except FileNotFoundError as e:
    print('文件找不到:', e)
finally:
    if f:
        f.close()  # 文件操作后一定要关闭

print('-' * 80)

# 简写,使用with...as语句,会自动调用close()
with open('itany.txt', mode='r', encoding='utf-8') as f:
    # print(f.read())
    # print(f.read(3))  # 每次读取3个字符
    # print(f.read(3))
    # print(f.readline().strip())  # 每次读取一行
    # print(f.readline())
    lines = f.readlines()  # 一次性读取所有行,返回list
    # print(lines)
    for line in lines:
        print(line.strip())

print('-' * 80)

# ----写文件
with open('itany.txt', mode='a', encoding='utf-8') as f:
    f.write('xxx\n')
    f.write('yyy')

print('-' * 80)

# ----读写二进制文件
with open('baidu.png', mode='rb') as f:
    with open('itany.png', mode='wb') as out:
        out.write(f.read())
        print('拷贝成功')

​ 文件操作模块

import os
import shutil

# ----操作文件和目录
print(os.path.exists('itany.txt'))  # 判断是否存在
print(os.path.abspath('itany.txt'))  # 文件的绝对路径
print(os.path.isfile('itany.txt'))  # 判断是否为文件
print(os.path.isdir('itany.txt'))  # 判断是否为目录
print(os.listdir('.'))  # 列出指定目录下所有内容
# 找出当前目录下所有的文件夹
dirs = [f for f in os.listdir('.') if os.path.isdir(f)]
print(dirs)

# 创建/删除目录
# os.mkdir('world')
if os.path.exists('world'):
    os.rmdir('world')

# 重命名文件或目录
# os.rename('itany.txt', 'aaa.txt')

# 删除文件
# os.remove('aaa.txt')

# 拷贝文件
shutil.copy('baidu.png', 'bbb.png')

八、访问MySQL

1. 简介

​ 使用pymysql模块:pip install pymysql

2. 基本操作

​ 增删改

import pymysql

# 定义数据库连接信息
config = {
    'host': 'localhost',
    'port': 3306,
    'user': 'root',
    'password': '',
    'database': 'python',
    'charset': 'utf8'
}

# 获取连接
conn = pymysql.connect(**config)

# 获取游标,相当于java中的Statement
cursor = conn.cursor()

# 执行sql
sql = '''
    insert into t_user 
      (username,password,age,height)
    values 
      (%s,%s,%s,%s)  
'''
num = cursor.execute(sql, ['alice', '123', 18, 175.2])  # 为占位符%s赋值
print(num)

# 提交事务
conn.commit()

# 关闭资源
cursor.close()
conn.close()

​ 查询

# 获取游标,相当于java中的Statement
cursor = conn.cursor(cursor=pymysql.cursors.DictCursor)  # 可以指定cursor的类型为字典,查询结果为Dict类型

# 执行sql
sql = '''
    select
        id,username,password,age,height
    from t_user    
'''
cursor.execute(sql)

# 获取查询结果
# print(cursor.fetchone()) # 每次读取一条,返回的是元组
# print(cursor.fetchone())
# print(cursor.fetchmany(2))  #  获取多条
# print(cursor.fetchall())  # 获取所有

for u in cursor.fetchall():
    print(u['username'], u['age'])

视频课程链接:http://edu.51cto.com/course/14859.html

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

Python基础入门视频课程——笔记

下载Word文档到电脑,方便收藏和打印~

下载Word文档

猜你喜欢

Python基础入门视频课程——笔记

视频课程链接:http://edu.51cto.com/course/14859.html一、Python简介1. Python是什么?​ Python是一种面向对象的解释型计算机程序设计语言,由荷兰人Guido van Rossum(
2023-01-31

Python基础入门笔记(一)

前言(认识Python)既然学习 Python,那么至少得了解下这门语言,知道 Python 代码执行过程吧。Python 的历史有兴趣的百度百科下就有,这个不多说了。1、我们先来了解下什么是解释型语言和编译型语言?计算机是不能够识别高级语
2023-01-31

python3完全零基础入门视频

【课程内容】计算机基础常识Python语言概览、安装与运行Python 变量、数据类型及存储Python 常用数据类型概览数值与字符串列表list字典表dict 与元组 tuple文件与类型汇总语句、表达式与if分支循环语句迭代函数定义与参
2023-01-31

python基础入门学习笔记(Python环境搭建)

Python学习第一篇。把之前学习的Python基础知识总结一下。 一、认识Python 首先我们得清楚这个:Python这个名字是从Monty Python借鉴过来的,而不是源于大家所知道的大蟒蛇的意思。我们为什么要学习Python呢?就
2022-06-04

云计算教程学习入门视频课件:云计算基础服务组件讲解

云计算服务,即 云服务 。 中国云计算服务网 的定义是:指可以拿来作为服务提供使用的云计算产品。包括云主机、云空间、云开发、云测试和综合类产品等。在本文中和大家讲解下云计算基础服务组件内容,基础服务组件包括 DNS、DHCP、用户管理、身份
2023-06-04

python入门基础教程

Python是一门简单易学、功能强大的编程语言,适合初学者入门。下面是一个简要的Python入门基础教程,帮助您快速上手Python编程。1. 安装Python:首先,您需要在计算机上安装Python解释器。您可以从Python官方网站(h
2023-10-25

《Python网络编程基础》笔记

python网络编程基础                          ==================Author: lujun9972 Date: 2013-03-08 22:29:20 CSTTa
2023-01-31

Python pygame入门基础教程

本篇文章给大家带来了关于Python的相关知识,大家都知道pygame是跨平台Python模块,专为电子游戏设计,包含图像、声音,下面介绍了关于Python pygame新手入门基础教程的相关资料,希望对大家有帮助。【相关推荐:Python3视频教程 】pygame简介pygame可以实现python游戏的一个基础包。pygame实现窗口初始化pygame,init()类似于java类的初始化方法,
2022-08-08

零基础入门篇之Linux及Arm-Linux程序开发笔记

前言:本文记录了自己从一个完全不懂Linux的人如何一步步学会Linux程序开发的过程。当然也希望本文能够达到它的目的,让那些和我一样没有任何基础的人也能快速入门Linux程序开发。 一、Arm-Linux程序开发平台简要介绍Arm-Lin
2022-06-04

Python编程入门到实践 - 笔记(

练习内容包括创建并访问列表列表的索引使用列表中的各个值修改列表中的元素在列表中添加元素 append()在列表中插入元素 insert()在列表中删除元素 del,pop()根据值删除列表中的元素 remove()对列表中的元素进行排列 
2023-01-31

python入门基础教程10 pytho

if分支语句分支语句的作用是在某些条件控制下有选择的执行实现一定功能语句块。if 分支语句则是当if后的条件满足时,if 下的语句块被执行,语法格式如下所示:if :    statements让我们看看代码吧。>>>
2023-01-31

python入门基础教程09 pytho

表达式表达式,是由数字、算符、数字分组符号括号、自由变量和约束变量等以能求得数值的有意义排列方法所得的组合,故表示通常是由操作数和操作符两部分组成,如果操作符前后均有操作数,我们称此类操作符是双目运算符,例如加法、减法、取模、赋值运算等运算
2023-01-31

python入门基础教程02 Pytho

02 Python简介Python简介Python是一种解释型、面向对象、动态数据类型的高级程序设计语言,属于应用层软件。自从20 世纪90 年代初Python语言诞生至今,它逐渐被广泛应用于处理系统管理任务、自动化运维、图像处理游戏和We
2023-01-31

python入门基础教程05 Pytho

Python-Shell反馈常见错误初学者通常会使用Python-Shell来学习Python基础及语法知识,在使用Python-Shell 时会遇到这样或者那样的错误,有的是语法错误,有的是键入的函数或者变量名字拼写错误,现就初学者常出现
2023-01-31

云计算教程学习入门视频课件:Load Balance讲解

负载均衡建立在现有网络结构之上,它提供了一种廉价有效透明的方法扩展网络设备和服务器的带宽、增加吞吐量、加强网络数据处理能力、提高网络的灵活性和可用性。负载均衡(Load Balance)其意思就是分摊到多个操作单元上进行执行,例如Web服务
2023-06-03

数据库零基础入门教程-JDBC核心技术精讲视频教程

JDBC简介 JDBC(Java Data Base Connectivity,java数据库连接)是一种用于执行SQL语句的Java API,可以为多种关系数据库提供统一访问,它由一组用Java语言编写的类和接口组成。JDBC提供了一种基准,据此可以构建更高
数据库零基础入门教程-JDBC核心技术精讲视频教程
2020-01-10

编程热搜

  • Python 学习之路 - Python
    一、安装Python34Windows在Python官网(https://www.python.org/downloads/)下载安装包并安装。Python的默认安装路径是:C:\Python34配置环境变量:【右键计算机】--》【属性】-
    Python 学习之路 - Python
  • chatgpt的中文全称是什么
    chatgpt的中文全称是生成型预训练变换模型。ChatGPT是什么ChatGPT是美国人工智能研究实验室OpenAI开发的一种全新聊天机器人模型,它能够通过学习和理解人类的语言来进行对话,还能根据聊天的上下文进行互动,并协助人类完成一系列
    chatgpt的中文全称是什么
  • C/C++中extern函数使用详解
  • C/C++可变参数的使用
    可变参数的使用方法远远不止以下几种,不过在C,C++中使用可变参数时要小心,在使用printf()等函数时传入的参数个数一定不能比前面的格式化字符串中的’%’符号个数少,否则会产生访问越界,运气不好的话还会导致程序崩溃
    C/C++可变参数的使用
  • css样式文件该放在哪里
  • php中数组下标必须是连续的吗
  • Python 3 教程
    Python 3 教程 Python 的 3.0 版本,常被称为 Python 3000,或简称 Py3k。相对于 Python 的早期版本,这是一个较大的升级。为了不带入过多的累赘,Python 3.0 在设计的时候没有考虑向下兼容。 Python
    Python 3 教程
  • Python pip包管理
    一、前言    在Python中, 安装第三方模块是通过 setuptools 这个工具完成的。 Python有两个封装了 setuptools的包管理工具: easy_install  和  pip , 目前官方推荐使用 pip。    
    Python pip包管理
  • ubuntu如何重新编译内核
  • 改善Java代码之慎用java动态编译

目录