栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Python

3.Python 进阶知识

Python 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

3.Python 进阶知识

文章目录
  • Python 进阶知识
    • 知识点一 : 数据类型
      • 1.数据类型 列表与元组
      • 2.数据类型 字典与集合
      • 3.数据类型 字符串
    • 知识点二 : 推导式
      • 1.列表推导式
      • 2.字典推导式
      • 3.元组推导式
      • 4.集合推导式
    • 知识点三 : 高阶函数
      • 1.filter 函数
      • 2.map 函数
      • 3.reduce 函数
      • 4.zip 函数
      • 5.enumerate 函数

Python 进阶知识 知识点一 : 数据类型 1.数据类型 列表与元组
"""
    1.列表与元组最直接的的区别是:
        列表长度大小不固定,是可变的.     --动态
        元组长度大小固定,不可变.        --静态
    2.__sizeof__()方法 : Python的内置函数,用来打印系统分配空间的大小.
    3.列表会一次性增加4个元素的空间,当空间使用完毕后才会继续增加 (64位操作系统中地址占用8个字节)
    4.namedtuple模块 : 继承自tuple的子类,用来创建一个和tuple类似的对象,且对象拥有可访问的属性.
    5.初始化空列表使用 []比 list() 快
    6.非空列表与非空元组初始化时,元组的效率更高
"""

# 1.用列表检测系统如何进行空间分配
my_list = []
print("初始化大小", my_list.__sizeof__(), ":", my_list)

my_list.append("a")
print("追加1个元素之后的大小", my_list.__sizeof__(), ":", my_list)

my_list.append("b")
print("追加2个元素之后的大小", my_list.__sizeof__(), ":", my_list)

my_list.append("c")
print("追加3个元素之后的大小", my_list.__sizeof__(), ":", my_list)

my_list.append("d")
print("追加4个元素之后的大小", my_list.__sizeof__(), ":", my_list)

my_list.append("e")
print("追加5个元素之后的大小", my_list.__sizeof__(), ":", my_list)
print("--------------")


# 2.使用namedtuple模块
from collections import namedtuple
Point = namedtuple(typename='Point', field_names=['x', 'y'])  # typename相当于是创建的类名,field_names用于为创建的元组的每个元素命名,可以传入列表或元组
p = Point(10, 20)
print(p.x)
print(p.y)
print("--------------")


# 3.比较 list() 与 [] 初始化效率
import timeit
a = timeit.timeit('a=list()', number=10000000 )
b = timeit.timeit('a=[]', number=10000000 )
print(a)
print(b)
print("--------------")


# 4.比较 非空元组 与 非空列表 初始化效率
import timeit
a = timeit.timeit('a=("a","b","c")', number=10000)
b = timeit.timeit('b=["a","b","c"]', number=10000)
print(a)
print(b)
print("--------------")




--------------------------------------------------
C:Users32495Envspython3.9.2Scriptspython.exe
初始化大小 40 : []
追加1个元素之后的大小 72 : ['a']
追加2个元素之后的大小 72 : ['a', 'b']
追加3个元素之后的大小 72 : ['a', 'b', 'c']
追加4个元素之后的大小 72 : ['a', 'b', 'c', 'd']
追加5个元素之后的大小 104 : ['a', 'b', 'c', 'd', 'e']
--------------
10
20
--------------
0.4988713
0.20966529999999994
--------------
0.00011539999999998773
0.0003946999999999701
--------------

进程已结束,退出代码0
2.数据类型 字典与集合
"""
    1.字典:
        1.1 在使用字典索引键时,若键不存在则出现KeyError错误,解决方法是在索引键时使用get(key,default)函数即可.(如 my_dict.get("F","None"))
    2.集合:
        2.1 集合不支持索引操作,使用索引查找对应元素值会报错(TypeError: 'set' object is not subscriptable)
        2.2 集合的执行效率远高于列表
"""

# 1.字典与集合的效率问题
import time


# 1.1 计算列表运行的时间
def find_unique_weight(students):
    # 声明一个统计列表
    unique_list = []
    # 循环所有学生数据
    for id, weight in students:
        # 如果体重没有在统计列表中
        if weight not in unique_list:
            # 新增体重数据
            unique_list.append(weight)
    # 计算列表长度
    ret = len(unique_list)
    return ret


id = [x for x in range(1, 10000)]
weight = [x for x in range(1, 10000)]  # 体重数据为了计算,也设置从 1 到 10000
students = list(zip(id, weight))

start_time = time.perf_counter()
find_unique_weight(students)
end_time = time.perf_counter()
print("列表运算时间为:{}".format(end_time - start_time))


# 1.2 计算列表运行的时间

def find_unique_weight(students):
    # 声明一个统计集合
    unique_set = set()
    # 循环所有学生数据
    for id, weight in students:
        # 集合会自动过滤重复数据
        unique_set.add(weight)
    # 计算集合长度
    ret = len(unique_set)
    return ret


id = [x for x in range(1, 10000)]
weight = [x for x in range(1, 10000)]
students = list(zip(id, weight))

start_time = time.perf_counter()
find_unique_weight(students)
end_time = time.perf_counter()
print("集合运算时间为:{}".format(end_time - start_time))




--------------------------------------------------
C:Users32495Envspython3.9.2Scriptspython.exe
列表运算时间为:0.6111517
集合运算时间为:0.0007663999999999449

进程已结束,退出代码0
3.数据类型 字符串
"""
    1.字符串:
        1.1 字符串是不可变的
        1.2 字符串拼接时,join函数 比 += 快
"""

# 1.比较同名字符串内存地址
my_str = "hello "
print(id(my_str))
my_str += "world"
print(id(my_str))
print(my_str)
print("---------------")

# 2.比较字符串拼接效率
import time


# 2.1 += 写法
def m0():
    s = ' '
    for n in range(0, 100000):
        s += str(n)


start_time = time.perf_counter()
m0()
end_time = time.perf_counter()
print("代码运行时间为:", end_time - start_time)


# 2.2 join 写法
def m1():
    l = []
    for n in range(0, 100000):
        l.append(str(n))
    s = ' '.join(l)


start_time = time.perf_counter()
m1()
end_time = time.perf_counter()
print("代码运行时间为:", end_time - start_time)


# 2.3 pythonic 写法
def m2():
    s = ' '.join(map(str, range(0, 100000)))


start_time = time.perf_counter()
m2()
end_time = time.perf_counter()
print("代码运行时间为:", end_time - start_time)




--------------------------------------------------
C:Users32495Envspython3.9.2Scriptspython.exe
2625249362416
2625250809136
hello world
---------------
代码运行时间为: 0.027465000000000003
代码运行时间为: 0.022872000000000003
代码运行时间为: 0.0164642

进程已结束,退出代码0
知识点二 : 推导式 1.列表推导式
"""
    1.列表推导式
        1.1 推导式格式:
            [表达式 for 迭代变量 in 可迭代对象 [if 条件表达式]]
        1.2 if 条件表达式非必选
        1.3 列表推导式运行效率高于传统for循环写法
        1.4 Python3中列表推导式具备局部作用域,表达式内部变量和赋值只在局部生效
"""


# 1.传统for循环写法
my_list = [1, 2, 3]
new_list = []
for i in my_list:
    new_list.append(i * 2)
print(new_list)
print("--------------")


# 2.列表推导式写法
my_list = [1, 2, 3]
new_list = []
nn_list = [i * 2 for i in my_list]
print(nn_list)
print("--------------")


# 3.列表推导式if语句
nn_list = [i * 2 for i in my_list if i > 1]
print(nn_list)
print("--------------")


# 4.列表推导式双重for循环
nn_list = [(x, y) for x in range(3) for y in range(3)]
print(nn_list)
print("--------------")


# 5.列表推导式局部性演示
x = 6
my_var = [x*2 for x in range(3)]
print(my_var)
print(x)
print("--------------")


# 6.列表推导式嵌套
my_var = [y*4 for y in [x*2 for x in range(3)]]
print(my_var)




--------------------------------------------------
C:Users32495Envspython3.9.2Scriptspython.exe
[2, 4, 6]
--------------
[2, 4, 6]
--------------
[4, 6]
--------------
[(0, 0), (0, 1), (0, 2), (1, 0), (1, 1), (1, 2), (2, 0), (2, 1), (2, 2)]
--------------
[0, 2, 4]
6
--------------
[0, 8, 16]

进程已结束,退出代码0
2.字典推导式
"""
    1.字典推导式
        1.1 推导式格式:
            {键:值 for 迭代变量 in 可迭代对象 [if 条件表达式]}
        1.2 字典中不能出现同名key,第二次出现的同名key将会覆盖掉前一个同名key的值
"""

# 1.字典推导式演示
my_dict = {key: value for key in range(3) for value in range(2)}
print(my_dict)
print("--------------")


# 2.字典推导式遍历一个具有键值关系的可迭代对象
my_tuple_list = [('name', '王小明'), ('age', 18), ('class', 'no1'), ('like', 'python')]
my_dict = {key: value for key, value in my_tuple_list}
print(my_dict)




--------------------------------------------------
C:Users32495Envspython3.9.2Scriptspython.exe
{0: 1, 1: 1, 2: 1}
--------------
{'name': '王小明', 'age': 18, 'class': 'no1', 'like': 'python'}

进程已结束,退出代码0
3.元组推导式
"""
    1.元组推导式:
        1.1 元组推导式运行结果返回的是一个地址值.
"""

my_tuple = (i for i in range(10))
print(my_tuple)






--------------------------------------------------
C:Users32495Envspython3.9.2Scriptspython.exe
 at 0x000001CFE12EFC10>

进程已结束,退出代码0
4.集合推导式
"""
    1.集合推导式:
        1.1 因为集合是无序且不重复的,所以会自动去掉重复元素导致每次运行显示的顺序不一样.
"""

my_set = {value for value in 'HelloWorld'}
print(my_set)





--------------------------------------------------
C:Users32495Envspython3.9.2Scriptspython.exe
{'d', 'e', 'r', 'l', 'o', 'W', 'H'}

进程已结束,退出代码0
知识点三 : 高阶函数 1.filter 函数
"""
    1.filter 函数
        1.1 函数原型:
            filter ( function or None, iterable ) --> filter object
                - 第一个参数是判断函数 ( 返回结果需要是 True 或 False).
                - 第二个为序列,该函数将对 iterable 序列依次执行 function ( item ) 操作, 返回结果是过滤后结果组成的序列.
        1.2 解释:
            filter 函数对序列中元素进行筛选, 获取符号条件的序列
"""


my_list = [1, 2, 3]
my_new_list = filter(lambda x: x > 2, my_list)
print(my_new_list)
print(list(my_new_list))    # 使用list函数查看序列内容



--------------------------------------------------
C:Users32495Envspython3.9.2Scriptspython.exe

[3]

进程已结束,退出代码0
2.map 函数
"""
    1.map 函数
        1.1 map 函数原型:
            map(func, *iterables) --> map object
        1.2 解释:
            map函数运行后生成一个list, 第一个参数是函数, 第二个参数是一个或多个序列
        1.3 map函数解决的问题:
            1.使用 map 函数不需要创建一个空列表.
            2.调用函数时不再需要带括号,map 函数会自动调用目标函数.
            3.map 函数会自动匹配序列中的所有元素.
"""

# 1.第一个参数为单参
my_list = [-1, 2, -3]
my_new_list = map(abs, my_list)
print(my_new_list)
print(list(my_new_list))  # 使用list函数查看序列内容
print("-----------------")


# 2.第一个参数为多参
def fun(x, y):
    return x + y


my_new_list = map(fun, [1, 2, 3], [4, 4, 4])    # fun 函数有2个参数,故需要两个序列
print(my_new_list)
print(list(my_new_list))
print("-----------------")





--------------------------------------------------
C:Users32495Envspython3.9.2Scriptspython.exe

[1, 2, 3]
-----------------

[5, 6, 7]
-----------------

进程已结束,退出代码0
3.reduce 函数
"""
    1.reduce函数
        1.1 函数原型:
            reduce(function, sequence[, initial]) -> value
                - 第一个参数是函数
                - 第二个参数是序列,返回结算结果之后的值
        1.2 解释:
            reduce函数用于滚动计算应用于列表中的连续值
"""

# 1.测试代码
from functools import reduce

my_list = [1, 2, 3]


def add(x, y):
    return x + y


my_new_list = reduce(add, my_list)
print(my_list)  # 1+2+3
print(my_new_list)
print("-----------------")

# 2.将测试代码第三个参数设置为4
my_new_list = reduce(add, my_list, 4)       # 第三个参数表示初始值,即累加操作初始的数值
print(my_list)  # 4 + 1+2+3
print(my_new_list)
print("-----------------")





--------------------------------------------------
C:Users32495Envspython3.9.2Scriptspython.exe
[1, 2, 3]
6
-----------------
[1, 2, 3]
10
-----------------

进程已结束,退出代码0
4.zip 函数
"""
    1.zip函数
        1.1 函数原型:
            zip(iter1 [,iter2 [...]]) --> zip object
        1.2 解释:
            - zip函数将可迭代对象作为参数,将对象中对应的元素打包成一个个元组,然后返回由这些元组组成的列表.
            - 如果各个迭代器的元素个数不一样,则返回列表长度与最短的对象相同,利用星号 (*)操作符将元组解压为列表
"""


# 1.测试代码
my_list1 = {1, 2, 3}
my_list2 = ["a", "b", "c"]
print(zip(my_list1, my_list2))
print(list(zip(my_list1, my_list2)))
print("-----------------")


# 2.测试代码展示*操作符
my_list = [(1, 'a'), (2, 'b'), (3, 'c')]
print(zip(*my_list))
print(list(zip(*my_list)))
print("-----------------")




--------------------------------------------------
C:Users32495Envspython3.9.2Scriptspython.exe

[(1, 'a'), (2, 'b'), (3, 'c')]
-----------------

[(1, 2, 3), ('a', 'b', 'c')]
-----------------

进程已结束,退出代码0
5.enumerate 函数
"""
    1.enumerate函数:
        1.1 函数原型:
            enumerate(iterable, start=0)
                - sequence: 一个序列、迭代器或其他支出迭代对象;
                - start: 下标起始位置.
        1.2 解释:
            enumerate函数用于将一个可遍历的数据对象组合为一个索引序列,同时列出数据和数据下标,一般用在for循环当中.
"""

weekdays = ['Mon', 'Tus', 'Wen', 'Thir']
print(enumerate(weekdays))
print(list(enumerate(weekdays)))





--------------------------------------------------
C:Users32495Envspython3.9.2Scriptspython.exe

[(0, 'Mon'), (1, 'Tus'), (2, 'Wen'), (3, 'Thir')]

进程已结束,退出代码0
转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/1022221.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号