Python入门笔记(二)(中)

简介: Python入门笔记(二)

第九章 集合set


9.1 创建集合:set()、集合生成式


  1. 一种是直接把一对元素用花括号括起来


  1. 一种是使用set()工厂函数


  1. 集合生成式


1.set()


例1


set1 = set([1,2,3,4,5,6])       #将list转换成set
print(set1)
print(type(set1))


{1, 2, 3, 4, 5, 6}
<class 'set'>


2.集合生成式


"""集合生成式,就是把列表的改成集合"""
# 列表生成式
list1 = [i*i for i in range(6)]
print(list1)
# 集合生成式
set1 = {i*i for i in range(6)}
print(set1)


[0, 1, 4, 9, 16, 25]
{0, 1, 4, 9, 16, 25}


9.2 集合性质


  1. 集合无映射关系,也是大括号


  1. 集合无序,不能索引


  1. 集合中每个元素只出现一次


num = {}               #字典
print(type(num))
num2 = {1,2,3,4,5}     #集合,无映射关系
print(type(num2))


<class 'dict'>
<class 'set'>


集合数据具有唯一性


num1 = {1,2,3,4,5,5,4,3,2,1}   #集合数据具有唯一性,集合是无序的,不能索引
print(num1)
#print(num1[2])    #错误,不可索引


{1, 2, 3, 4, 5}



num1 = [1,2,3,4,5,5,3,1,0]
num1 = set(num1)        #数据唯一,重复的自动删去
print(num1)


{0, 1, 2, 3, 4, 5}


集合中的数学操作:交集、并集、差集、对称差集


1、交集:intersection()、&


# 方法一:.intersection()
s1 = {10, 20, 30, 40}
s2 = {20, 30, 40, 50, 60}
print(s1.intersection(s2))
# 方法二
print(s1 & s2)


{40, 20, 30}
{40, 20, 30}


2、并集:union()、|


s1 = {10, 20, 30, 40}
s2 = {20, 30, 40, 50, 60}
# 方法一
print(s1.union(s2))
# 方法二
print(s1 | s2)


{40, 10, 50, 20, 60, 30}
{40, 10, 50, 20, 60, 30}


3、差集:-


s1 = {10, 20, 30, 40}
s2 = {20, 30, 40, 50, 60}
print(s1.difference(s2))  # s1中不同于s2的
print(s1 - s2)


{10}
{10}


4、对称差集:s1 + s2 - (s1 & d2) symmertric_difference()


s1 = {10, 20, 30, 40}
s2 = {20, 30, 40, 50, 60}
print(s1.symmetric_difference(s2))  # 除去两者相同的
print(s1 ^ s2)


{50, 10, 60}
{50, 10, 60}


9.3 一些函数:issubset()、issuperset()、isdisjoint()


1、判断相等


s = {10, 20, 30, 40}
s2 = {40, 20, 10, 30}
print(s == s2)


True


2、.issubset()判断是否为子集


s = {10, 20, 30, 40}
s3 = {10, 20, 30}
s4 = {20, 30, 40}
print(s3.issubset(s))   # 判断子集,s3是s的子集
print(s4.issubset(s))


True
True


3、.issuperset()判断是否为超集


s = {10, 20, 30, 40}
s3 = {10, 20, 30}
print(s.issuperset(s3))  # 判断超集,s是s3的超集


True


4、isdisjoint()判断是否有交集,有交集为False


s = {10, 20, 30, 40}
s3 = {10, 20, 30}
print(s3.isdisjoint(s))  # 有交集为False,否则为True


False


in, not in判断集合元素


s = {10, 20, 30, 40}
print(10 in s)
print(50 not in s)


True
True


9.4 集合增加元素:add()、update()


.add():集合添加元素


num1 = {1,2,3,4,5}
num1.add(6)            #添加6
print(num1)


{1, 2, 3, 4, 5, 6}


.update():可以一次添加多个


s = {10, 20, 30, 40}
s.update([50])
print(s)
s.update({60})
print(s)


{40, 10, 50, 20, 30}
{40, 10, 50, 20, 60, 30}


9.5 集合删除元素:remove()、discard()、pop()、clear()


.remove():集合删除指定元素,如果不存在就抛出异常


num1 = {1,2,3,4,5}
num1.remove(5)         #移除5
print(num1)


{1, 2, 3, 4}


.discard():一次删除一个指定元素,删除没有的不会报异常


s = {10, 20, 30, 40}
s.discard(10) 
s.discard(50)   # 删除没有的不会报异常
print(s)


{40, 20, 30}


.pop():一次只删除任意一个元素,删谁不知道


不能添加参数


s = {10, 20, 30, 40}
s.pop()
s.pop()  # 删除任意,删谁不知道
print(s)


{20, 30}


错误实例:


s.pop(10)   # 不能带参数,错误代码


.clear():清空集合,清空后为空集合


9.6 创建不能修改元素的集合:frozenset()


frozen:冰冻的,冻结的


num1 = frozenset([1,2,3,4,5])
print(num1)
print(type(num1))
num1.add(0)   #错误,frozenset删不掉
print(num1)


frozenset({1, 2, 3, 4, 5})
<class 'frozenset'>
    num1.add(0)   #错误
AttributeError: 'frozenset' object has no attribute 'add'


第十章 函数


什么是函数:函数就是执行特定任务和完成特定功能的一段代码


函数的作用:


  • 1、复用代码


  • 2、隐藏实现细节


  • 3、提高可维护性


  • 4、提高可读性便于调试


函数命名规则:


  • 小写


  • 下划线隔开单词


  • 注释函数功能


10.1 函数定义:def


形参赋值默认值等号两边不要有空格


def greet_user():
    """显示简单的问候语"""
    print("Hello!")
greet_user()


Hello!


空函数


def nop():
    pass


问题pass语句什么都不做,那有什么用?


实际上pass可以用来作为占位符,比如现在还没想好怎么写函数的代码,就可以先放一个pass,让代码能运行起来。


内嵌函数即函数内嵌入函数


def fun1():
    print('fun1正在被调用...')
    def fun2():    #fun2为fun1的内嵌函数
        print('fun2正在被调用...')
    fun2()     #fun1内部的函数,不可以在外部调用
fun1()


fun1正在被调用...
fun2正在被调用...


10.2 闭包


def FunX(x):
    def FunY(y):    #闭包,引用了外层函数的参数x
        return x*y
    return FunY
i = FunX(8)       #x=8
print(i)
print(type(i))
print(i(5))     #y=5
print(FunX(8)(5))    #只能调用X,不能Y,Y为内部局部变量


<function FunX.<locals>.FunY at 0x000002C19FBCF168>
<class 'function'>
40
40


例2


def Fun1():
    x = [5]
    def Fun2():
        x[0] *= x[0]
        return x[0]
    return Fun2()
print(Fun1())


25


例3


def Fun1():
    x = 5
    def Fun2():
        x *= x         #x未知
        return x
    return Fun2()
print(Fun1())


错误


x *= x
UnboundLocalError: local variable 'x' referenced before assignment


用函数封装代码


foods = ['苹果', '香蕉', '梨子']   # 所有的食物
my_foods = []                    # 我想要的食物,初始化为空
while foods:                    # 遍历食物
    food = foods.pop()          # 删除食物列表的最后一个,变成当前我点的食物
    print("我当前点的食物: " + food)
    my_foods.append(food)        # 把当前我点的食物加到我想要的食物列表中
print("\n我所有点的食物有以下:")
for my_food in my_foods:
    print(my_food)


我当前点的食物: 梨子
我当前点的食物: 香蕉
我当前点的食物: 苹果
我所有点的食物有以下:
梨子
香蕉
苹果


版本二: 用函数封装起来


def now_food(foods, my_foods):
    while foods:                    # 遍历食物
        food = foods.pop()          # 删除食物列表的最后一个,变成当前我点的食物
        print("我当前点的食物: " + food)
        my_foods.append(food)        # 把当前我点的食物加到我想要的食物列表中
def all_my_foods(my_foods):
    print("\n我所有点的食物有以下:")
    for my_food in my_foods:
        print(my_food)
foods = ['苹果', '香蕉', '梨子']   # 所有的食物
my_foods = []                    # 我想要的食物,初始化为空
now_food(foods, my_foods)
all_my_foods(my_foods)


商品打折小游戏


def discounts(price,rate):   #局部变量,只在定义里面
    final_price = price * rate
    return final_price    #局部变量,只在定义里面
old_price = float(input('请输入原价:'))  #old_price:全局变量,不在函数内
rate = float(input('请输入折扣率:'))
new_price = discounts(old_price,rate)
print('打折后价格是:',new_price)
#print('这是试图打印局部变量final_price的值:'final_price)  #错误,局部变量  


请输入原价:100
请输入折扣率:0.5
打折后价格是: 50.0


10.3 函数变量的作用域:局部、全局(global、nonlocal)


局部变量(local variable)


全局变量(global variable )


  • 局部变量:在函数内定义并使用的变量,只有函数内部有效,局部变量使用global声明,这个变量就会变成全局变量


  • 全局变量:函数体外定义的变量,可作用于函数内外


global:定义全局变量


count=5
def MyFun():
    count=10     #局部变量
    print(count)
MyFun()
print(count)


10
5


例2


count=5
def MyFun():
    global count    #定义count为全局变量,定义了则可以修改
    count=10
    print(count)
MyFun()
print(count)


10
10


nonlocal:定义非局部变量


def Fun1():
    x = 5
    def Fun2():
        nonlocal x    #定义x为非局部变量
        x *= x        #5*5
        return x      #25
    return Fun2()
print(Fun1())


25


10.4 实参和形参


def greet_user(username):    # 形参
    """显示简单的问候语"""
    print("Hello, " + username.title() + "!")
greet_user("huzhuzhu")      # 实参


Hello, Huzhuzhu!


1. 位置实参要求实参的顺序和形参的顺序相同


def describbe_pey(animal_type, pet_name):
    """显示宠物的信息"""
    print("\nI have a " + animal_type + ".")
    print("My " + animal_type + "'s name is " + pet_name + ".")
describbe_pey('z', 'zdb')


I have a z.
My z's name is zdb.


例2: 调用函数多次


def describbe_pey(animal_type, pet_name):
    """显示宠物的信息"""
    print("\nI have a " + animal_type + ".")
    print("My " + animal_type + "'s name is " + pet_name + ".")
describbe_pey('z', 'zdb')
describbe_pey('pet', 'zzz')


I have a z.
My z's name is zdb.
I have a pet.
My pet's name is zzz.


例3位置实参的顺序很重要


def describbe_pey(animal_type, pet_name):
    """显示宠物的信息"""
    print("\nI have a " + animal_type + ".")
    print("My " + animal_type + "'s name is " + pet_name + ".")
describbe_pey('zdb', 'z')


I have a zdb.
My zdb's name is z.


2. 关键字实参


接收的是dict关键字实参是传递给函数的名称-值对


def describbe_pet(animal_type, pet_name):
    """显示宠物的信息"""
    print("\nI have a " + animal_type + ".")
    print("My " + animal_type + "'s name is " + pet_name + ".")
describbe_pet(animal_type= 'z', pet_name= 'zdb')


I have a z.
My z's name is zdb.


命名关键字实参


从这个*之后的参数,只能采用关键字实参


def person(name, age, *, city, job):
    print(name, age, city, job)
person('Jack', 24, city='Beijing', job='Engineer')
person('Jack', 24, city='Beijing', job='Engineer')


Jack 24 Beijing Engineer
Jack 24 Beijing Engineer


3. 默认实参指定默认值的形参要放在未指定默认值的形参后面


注:提供的实参多余或少于函数完成其工作所需的信息时,将出现实参不匹配错误。


def describbe_pey(pet_name, animal_type='dog'):
    """显示宠物的信息"""
    print("\nI have a " + animal_type + ".")
    print("My " + animal_type + "'s name is " + pet_name + ".")
describbe_pey(pet_name= 'z')


I have a dog.
My dog's name is z.


例2


# end的默认值为换行,这里修改为制表符
print('hello', end='\t')
print('world')


hello world


默认实参为空字符,实现实参可选


例1有中间名的情况


def get_formatted_name(first_name, middle_name, last_name):
    """返回整洁的姓名"""
    full_name = first_name + " " + middle_name + " " + last_name
    return full_name.title()
musician = get_formatted_name('z', 'a', 'db')
print(musician)


Z A Db


例2: 中间名赋值为空字符


def get_formatted_name(first_name, last_name, middle_name=' '):
    """返回整洁的姓名"""
    if middle_name:            #python将没空字符串解读为True
        full_name = first_name + " " + middle_name + " " + last_name
    else:
        full_name = first_name + " " + last_name
    return full_name.title()
musician = get_formatted_name('z', 'db')
print(musician)
musician = get_formatted_name('z', 'db', 'a')
print(musician)


Z Db
Z A Db


4. 任意个数参数:*


个数可变的位置实参:*args


  • 定义函数时,可能无法实现确定传递的位置实参的个数时,使用可变的位置参数;结果为一个元组


个数可变的位置参数只能定义一个


def make_pizza(*toppings):
    """打印顾客点的所有配料"""
    print(toppings)
make_pizza('pepperoni')
make_pizza('mushrooms', 'green peppers', 'extra cheese')


('pepperoni',)
('mushrooms', 'green peppers', 'extra cheese')


例3


def calc(numbers):
    sum = 0
    for n in numbers:
        sum = sum + n * n
    return sum
print(calc([1, 2, 3]))
print(calc((1, 2, 5, 7)))


14
79


例4


def calc(*numbers):
    sum = 0
    for n in numbers:
        sum = sum + n * n
    print(sum)
calc(1, 2)
calc()
nums = [1, 2, 3]
calc(nums[0], nums[1], nums[2])
calc(*nums)


5
0
14
14


个数可变的关键字参数:**args


  • 定义函数时,无法事先确定传递的关键字形参的个数,使用可变的关键字形参


  • 结果为一个字典;个数可变的关键字参数也只能定义一个


# 个数可变的关键字形参
# 定义函数时,无法事先确定传递的关键字形参的个数,使用可变的关键字形参
# **arg
# 结果为一个字典
# 个数可变的关键字参数也只能定义一个
def fun(**args):
    print(args)
fun(a=10)
fun(a=10, b=20, c=30)


{'a': 10}
{'a': 10, 'b': 20, 'c': 30}


例2形参**user_info中的两个星号让python创建一个名为profile的空字典,并将收到的所有名称键-值对都封装到这个字典中。


def build_profiles(first, last, **user_info):
    """创建一个字典,其中包含我们知道的有关用户的一切"""
    profile = {}                      # 空字典profile
    profile['姓'] = first     # 键first name;   值first
    profile['名'] = last       # 键last name:    值last
    for key, value in user_info.items():    # 遍历键值对
        profile[key] = value                # 把value赋值给键对应的值
    return profile                          # 返回字典
# 调用函数
information = build_profiles('z', 'db',
                              性别='男',
                              家='南昌')
print(information)    #输出


{'姓': 'z', '名': 'db', '性别': '男', '家': '南昌'}


例3可变参数允许你传入0个或任意个参数,这些可变参数在函数调用时自动组装为一个tuple。


而关键字参数允许你传入0个或任意个含参数名的参数,这些关键字参数在函数内部自动组装为一个dict。请看示例:


def person(name, age, **kw):
    print('name:', name, 'age:', age, 'other:', kw)
person('Bob', 35, city='Beijing')
person('Adam', 45, gender='M', job='Engineer')
extra = {'city': 'Beijing', 'job': 'Engineer'}
person('Jack', 24, city=extra['city'], job=extra['job'])
person('Jack', 24, **extra)


name: Bob age: 35 other: {'city': 'Beijing'}
name: Adam age: 45 other: {'gender': 'M', 'job': 'Engineer'}
name: Jack age: 24 other: {'city': 'Beijing', 'job': 'Engineer'}
name: Jack age: 24 other: {'city': 'Beijing', 'job': 'Engineer'}


注意:

在一个函数的定义过程中,既有个数可变的关键字形参,又有个数可变的位置形参


要求,个数可变的位置形参,放在个数可变的关键字形参之前


5. 参数小结



参数顺序问题


def fun5(a, b, *, c, d, **args):
    pass
def fun6(*args1, **args2):
    pass
def fun7(a, b=10, *args, **args2)


实参为列表


def greet_users(names):     #names形参,对应实参usernames
    """向列表中的每位用户都发出简单的问候"""
    for name in names:      #name临时参数
        msg = "Hello, " + name.title() + "!"
        print(msg)
usernames = ['hannnah', 'try', 'margot']    #实参为列表
greet_users(usernames) 


Hello, Hannnah!
Hello, Try!
Hello, Margot!


结合使用位置实参和任意数量实参


  • 如果要让函数接受不同类型的实参,必须在函数定义中接纳任意数量实参的形参放在最后。python先匹配位置实参和关键字实参,再将余下的实参都收集到最后一个形参中。


def make_pizza(size, *toppings):
    """概述要制作的披萨"""
    print("我想要个 " + str(size) + "块的手抓饼," +
          "我要加:")
    for topping in toppings:
        print(topping)
make_pizza(16, '番茄酱')
make_pizza(12, '番茄酱', '热狗', '鸡蛋')



参数组合


def f1(a, b, c=0, *args, **kw):
    print('a =', a, 'b =', b, 'c =', c, 'args =', args, 'kw =', kw)
def f2(a, b, c=0, *, d, **kw):
    print('a =', a, 'b =', b, 'c =', c, 'd =', d, 'kw =', kw)
f1(1, 2)
f1(1, 2, c=3)
f1(1, 2, 3, 'a', 'b')
f1(1, 2, 3, 'a', 'b', x=99)
f2(1, 2, d=99, ext=None)


a = 1 b = 2 c = 0 args = () kw = {}
a = 1 b = 2 c = 3 args = () kw = {}
a = 1 b = 2 c = 3 args = ('a', 'b') kw = {}
a = 1 b = 2 c = 3 args = ('a', 'b') kw = {'x': 99}
a = 1 b = 2 c = 0 d = 99 kw = {'ext': None}


例2


def f1(a, b, c=0, *args, **kw):
    print('a =', a, 'b =', b, 'c =', c, 'args =', args, 'kw =', kw)
def f2(a, b, c=0, *, d, **kw):
    print('a =', a, 'b =', b, 'c =', c, 'd =', d, 'kw =', kw)
args = (1, 2, 3, 4)
kw = {'d': 99, 'x': '#'}
f1(*args, **kw)
args = (1, 2, 3)
kw = {'d': 88, 'x': '#'}
f2(*args, **kw)


a = 1 b = 2 c = 3 args = (4,) kw = {'d': 99, 'x': '#'}
a = 1 b = 2 c = 3 d = 88 kw = {'x': '#'}


目录
打赏
0
0
0
0
16
分享
相关文章
Python入门:3.Python的输入和输出格式化
在 Python 编程中,输入与输出是程序与用户交互的核心部分。而输出格式化更是对程序表达能力的极大增强,可以让结果以清晰、美观且易读的方式呈现给用户。本文将深入探讨 Python 的输入与输出操作,特别是如何使用格式化方法来提升代码质量和可读性。
Python入门:3.Python的输入和输出格式化
Python入门:1.Python介绍
Python是一种功能强大、易于学习和运行的解释型高级语言。由**Guido van Rossum**于1991年创建,Python以其简洁、易读和十分工程化的设计而带来了庞大的用户群体和丰富的应用场景。这个语言在全球范围内都被认为是**创新和效率的重要工具**。
Python入门:1.Python介绍
Python入门:8.Python中的函数
### 引言 在编写程序时,函数是一种强大的工具。它们可以将代码逻辑模块化,减少重复代码的编写,并提高程序的可读性和可维护性。无论是初学者还是资深开发者,深入理解函数的使用和设计都是编写高质量代码的基础。本文将从基础概念开始,逐步讲解 Python 中的函数及其高级特性。
Python入门:8.Python中的函数
Python入门:6.深入解析Python中的序列
在 Python 中,**序列**是一种有序的数据结构,广泛应用于数据存储、操作和处理。序列的一个显著特点是支持通过**索引**访问数据。常见的序列类型包括字符串(`str`)、列表(`list`)和元组(`tuple`)。这些序列各有特点,既可以存储简单的字符,也可以存储复杂的对象。 为了帮助初学者掌握 Python 中的序列操作,本文将围绕**字符串**、**列表**和**元组**这三种序列类型,详细介绍其定义、常用方法和具体示例。
Python入门:6.深入解析Python中的序列
Python入门:9.递归函数和高阶函数
在 Python 编程中,函数是核心组成部分之一。递归函数和高阶函数是 Python 中两个非常重要的特性。递归函数帮助我们以更直观的方式处理重复性问题,而高阶函数通过函数作为参数或返回值,为代码增添了极大的灵活性和优雅性。无论是实现复杂的算法还是处理数据流,这些工具都在开发者的工具箱中扮演着重要角色。本文将从概念入手,逐步带你掌握递归函数、匿名函数(lambda)以及高阶函数的核心要领和应用技巧。
Python入门:9.递归函数和高阶函数
Python入门:7.Pythond的内置容器
Python 提供了强大的内置容器(container)类型,用于存储和操作数据。容器是 Python 数据结构的核心部分,理解它们对于写出高效、可读的代码至关重要。在这篇博客中,我们将详细介绍 Python 的五种主要内置容器:字符串(str)、列表(list)、元组(tuple)、字典(dict)和集合(set)。
Python入门:7.Pythond的内置容器
Python入门:2.注释与变量的全面解析
在学习Python编程的过程中,注释和变量是必须掌握的两个基础概念。注释帮助我们理解代码的意图,而变量则是用于存储和操作数据的核心工具。熟练掌握这两者,不仅能提高代码的可读性和维护性,还能为后续学习复杂编程概念打下坚实的基础。
Python入门:2.注释与变量的全面解析
Python 编程基础与实战:从入门到精通
本文介绍Python编程语言,涵盖基础语法、进阶特性及实战项目。从变量、数据类型、运算符、控制结构到函数、列表、字典等基础知识,再到列表推导式、生成器、装饰器和面向对象编程等高级特性,逐步深入。同时,通过简单计算器和Web爬虫两个实战项目,帮助读者掌握Python的应用技巧。最后,提供进一步学习资源,助你在Python编程领域不断进步。
Python入门:4.Python中的运算符
Python是一间强大而且便捷的编程语言,支持多种类型的运算符。在Python中,运算符被分为算术运算符、赋值运算符、复合赋值运算符、比较运算符和逻辑运算符等。本文将从基础到进阶进行分析,并通过一个综合案例展示其实际应用。
Python Pandas入门:行与列快速上手与优化技巧
Pandas是Python中强大的数据分析库,广泛应用于数据科学和数据分析领域。本文为初学者介绍Pandas的基本操作,包括安装、创建DataFrame、行与列的操作及优化技巧。通过实例讲解如何选择、添加、删除行与列,并提供链式操作、向量化处理、索引优化等高效使用Pandas的建议,帮助用户在实际工作中更便捷地处理数据。
65 2

热门文章

最新文章

AI助理

你好,我是AI助理

可以解答问题、推荐解决方案等