Python学习(三)

1. 元组解包 - 交换变量值。

a, b = 5, 10
a, b = b, a  # 元组解包实现变量交换
print(a, b)  # 输出 10, 5

2. 列表推导式与列表生成式 - 生成器表达式节省内存。

# 列表推导式
even_squares = [x**2 for x in range(10) if x % 2 == 0]

# 列表生成式
even_squares_gen = (x**2 for x in range(10) if x % 2 == 0)
print(list(even_squares_gen))  # 输出相同,但生成器更节省内存

3. 字典的键冲突处理 - 使用collections.defaultdict

from collections import defaultdict
counter = defaultdict(int)
counter["apple"] += 1
print(counter)  # 输出 {"apple": 1}

4. 列表和集合的区别 - 列表有序,集合无序且不允许重复。

a.列表的定义

# 方式一
lst1 = []
print("method1:", type(lst1))  # 输出 method1: <class 'list'>
# 方式二
lst2 = list()
print("method2:", type(lst2))  # 输出 method2: <class 'list'>

# list()为工厂函数,可以把其他数据类型转换为list
# 若在list()中传递的是可迭代对象时,可挨个存入列表
lst3 = list("123abc")
print("lst3 is", lst3)   # 输出  lst3 is ['1', '2', '3', 'a', 'b', 'c']

  b.list特点

  • list为有序项目集合

lst = ["a", "b", "c", "d", "e"]
# 输出列表第3个元素
print(lst[2])  # 输出 c
# lst[-1:2:-2] 其中-1为起始位置[正数从头往后, 负数则从后往前],2为结束位置(不包括),-2位步长[正负跟第一参数走, 1代表一个接一个, 2代表中间跳跃一个,以此类推]
# 正数表示从前往后 负数表示从后往前
print(lst[1:3:1])
  •  list为可变数据类型

    lst = ["abc", "123"]
    #id()内置函数返回对象的内存地址
    print("the id before modifing is", id(lst))
    #尝试直接修改原list,查看内存地址是否改变
    lst[1] = "xxyy"
    print("the id after modifing is", id(lst))
     
    #如果直接修改不可变数据类型,会报错
    #string为不可变数据类型
    str1 = "abc"
    try:
        #尝试修改str1的第1个元素
        str1[0] = "x"
        print("modify successful!")
    except TypeError as err:
        print(err)
  • list可以存放任何数据类型

    #print表示存放内置函数
    lst = ["a", 3.4, 4, [1], print]

c. list的增删改查

  • list的新增

函数具体作用
appen()往列表末尾追加元素
insert()在指定位置插入元素
extend()传入的元素为可迭代对象,依次向末尾插入每个元素
lst = ["aa", "12", "bb"]
 
lst.append("xxx")
print("after append:", lst)
 
lst.insert(2, "***")
print("after insert:", lst)
 
lst.extend("123")
print("after extend:", lst)
  • list的运算

    lst1 = [1, 2]
    lst2 = [3, 4]
    print("lst1 + lst2 =", lst1 + lst2)
    print("lst1 * 3 =", lst1 * 3)
  • list的删除

函数具体作用
pop()

默认删除末尾元素,也可以指定下标删除

可以返回删除的值

remove()指定元素删除,元素不存在会报错
del语句删除切片
clear()删除全部元素
lst = ["a", "b", 1, 2, "c", "d"]
 
value = lst.pop()
print("delete the end of list:", lst)
print("the value of deleting:", value)
lst.pop(0)
print("delete the first of list:", lst)
 
try:
    lst.remove("d")
    print("delete success!")
except:
    print("delete fail!")
 
del lst[2:]
print("delect the a slice of list:", lst)
 
lst.clear()
print("delete all elements:", lst)
  • list的修改

    lst = ["a", "b", "c", "e", "f"]
    #通过下标修改
    lst[2] = "***"
    print("after modifying by index:", lst)
    #通过切片修改,赋值对象是一个可迭代对象
    lst[3:] = "123"
    print("after modifying by slice:", lst)

    d. list统计

    函数具体作用
    len()统计列表的长度
    count()

    统计指定元素在列表中出现的次数

    index()返回指定元素在列表中出现的下标位置,若有指定元素有多个,返回第一个元素的下标
lst = ["a", "a", "d", "d", "e"]
print("the length of list:", len(lst))
print("the count of a:", lst.count("a"))
try:
    print("the index of d:", lst.index("d"))
except ValueError as err:
    print(err)

 e. list的拷贝

        若直接使用"lst2 = lst1"进行复制,lst1与lst2指向的就是同一个对象,若改变lst2中的值也会对lst1中的值产生影响,可以使用copy()进行浅拷贝--仅拷贝类型的值

lst1 = ["a", "b", "c", "d", "e", "f"]
lst2 = lst1.copy()
 
#修改lst2的值 不会对lst1产生影响
lst2[2] = "***"
print("lst1 is", lst1)
print("lst2 is", lst2)
 
#以切片的方式也可以实现浅拷贝
lst3 = lst1[:]
lst3[3] = "***"
print("lst1 is", lst1)
print("lst3 is", lst3)

f.  list的反转--reverse

lst = ['a', 'b', 'c', 'd', 'e', 'f']
lst.reverse()
print("reverse list:", lst)


g. list的排序--sort


sort方法默认对列表进行升序排序,若列表内元素是数字,则按照数字从小到大进行排序;若列表内元素为字符串,则按照字符串所有字符的Unicode码之和进行排序

lst = ['f', 'e', 'd', 'c', 'b', 'a']
lst.sort()
print("asc:", lst)
#降序排序
lst.sort(reverse=True)
print("desc:", lst)


h. list的遍历

lst = ["abc", "aa", "xx", "xyz"]
 
# 依次取列表中的元素
for i in lst:
    print(i)
 
# enumerate返回下标和值
print("key  -->     value")
for k, v in enumerate(lst):
    print(f"{k}    -->     {v}")

i. set的特点

        set可以理解为一个只有key的字典,所有里面的元素都是唯一的,天生去重
该特点可以用于类型的转换,实现去重

    无序项目集合
    可变数据类型,但集合中的元素必须是不可变数据类型


j. set的新增

s1 = {1, 2, 3}
 
# 新增1个元素
s1.add(4)
print(f"after add:", s1)
 
# 一次性新增多个元素update--传递可迭代对象
s1.update("abc")
print(f"after update:", s1)


k. set的删除

s1 = {1, 2, 3, 4, 'a', 'c', 'b'}
 
# 使用remove删除元素,若要删除的元素set中没有会报错
s1.remove(4)
print("after remove:", s1)
 
# 使用discard删除元素,要删除的元素不在set中也不会报错
s1.discard("x")
print("after discard:", s1)


l. set集合运算

s1 = {1, 2, 3, 4}
s2 = {2, 4, 5, 6}
 
# 交集
print("s1 & s2 =", s1 & s2)
# 并集
print("s1 | s2 =", s1 | s2)
# 差集
print("s1 - s2 =", s1 - s2)
print("s2 - s1 =", s2 - s1)
# 对称差集--在s1、s2中,但不同时在两个里面
print("s1 ^ s2 =", s1 ^ s2)

5.  函数返回多个值 - 使用元组或列表。

def get_name_and_age():
    return "Alice", 25

name, age = get_name_and_age()
print(name, age)  # 输出 Alice 25

6. 列表推导式中的条件判断 - 更灵活的控制。

odds = [x for x in range(10) if x % 2 != 0]
print(odds)  # 输出 [1, 3, 5, 7, 9]

7. 上下文管理器with - 自动关闭资源。

with open("file.txt", "r") as file:
    content = file.read()
print(content)
# 文件会在with语句结束后自动关闭

8. Python的魔术方法__str__ - 自定义对象的字符串表示。

        a.  __str__()方法的作用

                将__str__()返回的内容以字符串形式输出

        b.  装饰器高级技巧 - 使用functools.wraps保持原函数信息。

                通过print()函数触发

class Person:
    def __init__(self,name,age):
        self.name = name
        self.age = age

one = Person('小红',20)
print(one)

# 运行结果 <__main__.Person object at 0x000001ECF6F25E40>

                如上所示,定义一个Person类,创建对象one后使用print输出对象实例时,默认打印对象的内存地址。

class Person:
    def __init__(self,name,age):
        self.name = name
        self.age = age

    def __str__(self):
        return '姓名是{},年龄是{}'.format(self.name,self.age)
        

one = Person('小红',20)
print(one)
# 运行结果 姓名是小红,年龄是20

        上述代码使用了__str__方法,当调用print()函数时,会找到实例对象one的__str__方法,输出__str__方法的返回值内容。

                通过str()函数触发

class Person:
    def __init__(self,name,age):
        self.name = name
        self.age = age

    def __str__(self):
        return '姓名是{},年龄是{}'.format(self.name,self.age)


one = Person('小红',20)
words = str(one)
print(worlds,type(words))
# 输出结果 姓名是小红,年龄是20<class'str'>

使用str()函数触发__str__方法输出的内容与直接调用print()函数触发的结果看似相同,但是过程是不一样的。

- 使用print()函数触发:触发时,会自动寻找实例对象的方法,若没有则直接按照默认内容输出,有则输出__str__方法的返回值。
- 使用str()函数触发:如上述代码所示,使用str()触发时,worlds类型是str,是一个字符串,打印输出的是一个字符串words。

9. 装饰器高级技巧 - 使用functools.wraps保持原函数信息。

from functools import wraps

def timer(func):
    @wraps(func)
    def wrapper(*args, **kwargs):
        start_time = time.time()
        result = func(*args, **kwargs)
        end_time = time.time()
        print(f"{func.__name__} took {end_time - start_time} seconds.")
        return result
    return wrapper

@timer
def my_function():
    pass

my_function()

      

10. 异常处理和try-except-finally - 控制流程的灵活性。

try:
    div_by_zero = 10 / 0
except ZeroDivisionError:
    print("Can't divide by zero!")
finally:
    print("Execution completed.")

  • 8
    点赞
  • 20
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值