Python学习之旅 —— 基础篇(三)set集合、函数、文件操作

本篇要点:

数据类型:set集合

函数

文件操作

三元运算(三目运算)和lambda表达式

一、set集合

python中数据类型的一种,是无序并且不重复的数据集合。set源码:

class set(object):
    """
     创建set集合
    set() -> new empty set object
     把可迭代的数据类型转换成元组
    set(iterable) -> new set object

    Build an unordered collection of unique elements.
    """

>>> s1 = {11, 22, 33}
>>> print(s1,type(s1))
{33, 11, 22} <class ‘set‘>

>>> l1 = [2, 3, 4,]
>>> s1 = set(l1)
>>> print(l1,type(l1))
[2, 3, 4] <class ‘list‘>
>>> print(s1,type(s1))
{2, 3, 4} <class ‘set‘>

    # 向集合中增加元素,如果存在,不做任何操作。
    def add(self, *args, **kwargs): # real signature unknown
        """
        Add an element to a set.

        This has no effect if the element is already present.
        """
        pass

>>> s1 = {11, 22, 33}
>>> s1.add(44)
>>> print(s1)
{33, 11, 44, 22}

# 清空集合中所有的元素
    def clear(self, *args, **kwargs): # real signature unknown
        """ Remove all elements from this set. """
        pass

>>> s1 = {11, 22, 33}
>>> print(s1)
{33, 11, 22}
>>> s1.clear()
>>> print(s1)
set()

# 浅复制一个集合 只拷贝第一层
    def copy(self, *args, **kwargs): # real signature unknown
        """ Return a shallow copy of a set. """
        pass

    # s1.difference(s2) 找到在s1中有,s2中没有的元素,并保存到一个新的集合
    def difference(self, *args, **kwargs): # real signature unknown
        """
        Return the difference of two or more sets as a new set.

        (i.e. all elements that are in this set but not the others.)
        """
        pass

>>> s1 = {11,22,33,}
>>> s2 = {22,33,44,}
>>> s3 = s1.difference(s2)
>>> print("%s \n%s \n%s" % (s1,s2,s3))
{33, 11, 22}
{33, 44, 22}
{11}

# s1.difference(s2) 找到在s1中有,s2中没有的元素,把结果更新到s1中
    def difference_update(self, *args, **kwargs): # real signature unknown
        """ Remove all elements of another set from this set. """
        pass

>>> s1 = {11,22,33,}
>>> s2 = {22,33,44,}
>>> s1.difference_update(s2)
>>> print("%s \n%s" % (s1,s2))
{11}
{33, 44, 22}

# s1.intersection(s2) 找到即在集合s1中,又在集合s2中的元素,并把结果保存到一个新的集合里。
    def intersection(self, *args, **kwargs): # real signature unknown
        """
        Return the intersection of two sets as a new set.

        (i.e. all elements that are in both sets.)
        """
        pass

>>> s1 = {11,22,33,}
>>> s2 = {22,33,44,}
>>> s3 = s1.intersection(s2)
>>> print("%s \n%s \n%s" % (s1,s2,s3))
{33, 11, 22}
{33, 44, 22}
{33, 22}

# s1.intersection(s2) 找到即在集合s1中,又在集合s2中的元素,并把结果更新到s1中
    def intersection_update(self, *args, **kwargs): # real signature unknown
        """ Update a set with the intersection of itself and another. """
        pass

>>> s1 = {11,22,33,}
>>> s2 = {22,33,44,}
>>> s1.intersection_update(s2)
>>> print("%s \n%s" % (s1,s2))
{33, 22}
{33, 44, 22}

  # 判断两个集合是否有交接,没有交集时返回True,有交集时返回False

    def isdisjoint(self, *args, **kwargs): # real signature unknown
        """ Return True if two sets have a null intersection. """
        pass

>>> s1 = {11,22,33,}
>>> s2 = {22,33,44,}
>>> s3 = {1,2,3,}
>>> s1.isdisjoint(s2)
False
>>> s1.isdisjoint(s3)
True

# s1.issubset(s2) 判断s1是不是s2的子集

    def issubset(self, *args, **kwargs): # real signature unknown
        """ Report whether another set contains this set. """
        pass

>>> s1 = {11,22,}
>>> s2 = {11,22,33,44,}
>>> s3 = {22,33,}
>>> s1.issubset(s2)
True
>>> s1.issubset(s3)
False

# s1.issuperset(s2) 判断s1是不是s2的父集
    def issuperset(self, *args, **kwargs): # real signature unknown
        """ Report whether this set contains another set. """
        pass

>>> s1 = {11,22,33,44,55}
>>> s1 = {11,22,33,44,55,}
>>> s2 = {22,33,55,}
>>> s3 = {44,33,66,}
>>> s1.issuperset(s2)
True
>>> s1.issuperset(s3)
False


# 任意删除并返回一个元素
    def pop(self, *args, **kwargs): # real signature unknown
        """
        Remove and return an arbitrary set element.
        Raises KeyError if the set is empty.
        """
        pass

>>> s1 = {11,22,33,44,55,}
>>> s1.pop()
33

    # 删除指定的一个元素,这个元素必须在集合中,否则报错。区别于discard()
    def remove(self, *args, **kwargs): # real signature unknown
        """
        Remove an element from a set; it must be a member.

        If the element is not a member, raise a KeyError.
        """
        pass

>>> s1 = {11,22,33,}
>>> s1.remove(11)
>>> print(s1)
{33, 22}
>>> s1.remove(44)
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
KeyError: 44

    # 删除指定的一个元素,如果元素不存在不报错。可以起到判断元素是否在集合中时,代码不报错的作用。
    def discard(self, *args, **kwargs): # real signature unknown
        """
        Remove an element from a set if it is a member.

        If the element is not a member, do nothing.
        """
        pass

>>> s1 = {11,22,33,}
>>> s1.discard(11)
>>> print(s1)
{33, 22}
>>> s1.discard(44)   # 44 不在s1中,操作时不报错
>>> print(s1)
{33, 22}

# 相当于取两个集合的并集,再把他俩的交集删掉。返回这个新集合。
    def symmetric_difference(self, *args, **kwargs): # real signature unknown
        """
        Return the symmetric difference of two sets as a new set.

        (i.e. all elements that are in exactly one of the sets.)
        """
        pass

>>> s1 = {11,22,33,44,}
>>> s2 = {22,44,55,66}
>>> s3 = s1.symmetric_difference(s2)
>>> print("%s \n%s \n%s" % (s1,s2,s3))
{33, 11, 44, 22}
{66, 44, 22, 55}
{33, 66, 11, 55}

    # s1.symmetric_difference_update(s2) 相当于取s1,s2两个集合的并集,再把他俩的交集删掉。结果赋值给s1
    def symmetric_difference_update(self, *args, **kwargs): # real signature unknown
        """ Update a set with the symmetric difference of itself and another. """
        pass

>>> s1 = {11,22,33,44,}
>>> s2 = {22,44,55,66}
>>> s1.symmetric_difference_update(s2)
>>> print("%s \n%s" % (s1,s2))
{33, 66, 11, 55}
{66, 44, 22, 55}

    # 取两个集合的并集,结果返回到一个新集合中。
    def union(self, *args, **kwargs): # real signature unknown
        """
        Return the union of sets as a new set.

        (i.e. all elements that are in either set.)
        """
        pass

>>> s1 = {11,22,33,44,}
>>> s2 = {22,44,55,66}
>>> s3 = s1.union(s2)
>>> print("%s \n%s \n%s" % (s1,s2,s3))
{33, 11, 44, 22}
{66, 44, 22, 55}
{33, 66, 11, 44, 22, 55}

# s1.update(s2) 去两个集合的并集,将结果赋值给s1
    def update(self, *args, **kwargs): # real signature unknown
        """ Update a set with the union of itself and others. """
        pass

>>> s1 = {11,22,33,44,}
>>> s2 = {22,44,55,66}
>>> s1.update(s2)
>>> print("%s \n%s" % (s1,s2))
{33, 66, 11, 44, 22, 55}
{66, 44, 22, 55}


二、函数

为什么要创建函数?

提升代码的复用性和可读性

# 使用函数前,是面向过程变成,更具逻辑从上到下一行一行执行。
while True:
    if cpu利用率 > 90%:
        #发送邮件提醒
        连接邮箱服务器
        发送邮件
        关闭连接

    if 硬盘使用空间 > 90%:
        #发送邮件提醒
        连接邮箱服务器
        发送邮件
        关闭连接

    if 内存占用 > 80%:
        #发送邮件提醒
        连接邮箱服务器
        发送邮件
        关闭连接

sendmail函数(使用参数前)

# 使用函数后,就变成函数式,面向对象编程
def 发送邮件(内容)
    #发送邮件提醒
    连接邮箱服务器
    发送邮件
    关闭连接

while True:

    if cpu利用率 > 90%:
        发送邮件(‘CPU报警‘)

    if 硬盘使用空间 > 90%:
        发送邮件(‘硬盘报警‘)

    if 内存占用 > 80%:
        发送邮件(‘内存报警‘)
 

sendmail函数(使用参数后)

函数式:将某功能代码封装到函数中,日后便无需重复编写,仅调用函数即可

面向对象:对函数进行分类和封装

1、函数的定义

def 函数名(参数):

    函数体

return

a、def——python中表示函数的关键字

b、函数名——定义函数名称,以后根据函数名称来调用函数

c、(参数)——为函数提供数据

d、函数体——定义在函数中的一系列逻辑计算,函数具体功能的代码实现,写在这个里面

e、返回值(return)——当函数执行完毕后,给调用者返回数据

示例1:邮件发送函数

def sendmail():
    import smtplib
    from email.mime.text import MIMEText
    from email.utils import formataddr

    msg = MIMEText(‘邮件内容‘, ‘plain‘, ‘utf-8‘)
    msg[‘From‘] = formataddr(["武沛齐", ‘[email protected]‘])
    msg[‘To‘] = formataddr(["走人", ‘[email protected]‘])
    msg[‘Subject‘] = "主题"

    server = smtplib.SMTP("smtp.126.com", 25)
    server.login("[email protected]", "WW.3945.5")
    server.sendmail(‘[email protected]‘, [‘[email protected]‘, ], msg.as_string())
    server.quit()
sendmail()

sendmail()——无参数

2、参数的使用

示例1中,实现了给[email protected]发用邮件的功能。但是如果我想要给不同的收件人发邮件,就要写好多个函数,起不到复用代码的效果。因此加上参数。

def sendmail(user_email):  # user_email 叫做函数sendmail的形式参数,简称形参
    import smtplib
    from email.mime.text import MIMEText
    from email.utils import formataddr

    msg = MIMEText(‘邮件内容‘, ‘plain‘, ‘utf-8‘)
    msg[‘From‘] = formataddr(["武沛齐", ‘[email protected]‘])
    msg[‘To‘] = formataddr(["走人", ‘[email protected]‘])
    msg[‘Subject‘] = "主题"

    server = smtplib.SMTP("smtp.126.com", 25)
    server.login("[email protected]", "WW.3945.5")
    server.sendmail(‘[email protected]‘, [user_email, ], msg.as_string())
    server.quit()
sendmail("[email protected]”)  # [email protected]叫做sendmail的实际参数,调用sendmail函数时把这个参数传递给函数来执行。叫做实际参数,简称实参
sendmail(“[email protected]")
sendmail(“[email protected]")

sendmail(user_email)——有参数

引入参数后,就可以给上面三个邮箱发送邮件,而不用定义多个函数。

3、多个参数的使用和返回值

示例2:登陆、注册函数

def login(username, password):
    """
    用于用户登陆
    :param username: 用户输入的用户名
    :param password: 用户输入的密码
    :return: True,登陆成功;False,登录失败
    """
    with open("db", "r") as f:
        for i in f:
            user_pwd_list = i.strip().split(",")
            if username == user_pwd_list[0] and password == user_pwd_list[1]:
                return True
    return False

def register(username, password):
    """
     用于用户注册
    :param username: 用户输入的用户名
    :param password:  用户输入的密码
    :return: None
    """
    item = "\n{username},{password}".format(username=username, password=password)
    with open("db", "a") as f:
        f.write(item)
    print("注册成功")

def main():
    """
    用于程序执行的入口
    :return:  默认返回None
    """
    choice = input("[1:登陆],[2:注册],请输入数字编号:")
    user = input("请输入用户名:")
    pwd = input("请输入密码:")
    if choice == "1":
        t = login(user, pwd)  # 函数的return返回值赋值给t
        if t is True:
            print("登陆成功")
        else:
            print("登陆失败")

    elif choice == "2":
        register(user, pwd)

main()

登陆注册

示例中定义了三个函数,login、register、main。前两个函数需要传递用户名和密码两个参数才能正常完成用户的登陆和验证。因此设定两个形参,让调用者传递两个实参来实现功能。而main函数中,函数的返回值赋值给了t,通过对t的值进行判断,实现了打印不同内容的功能。

4、函数参数的更多类型

上面两个示例都是对普通参数的使用,参数还有更多类型,下面一一说明。

# 普通参数
def send(email, user, msg):
    print(‘发送成功‘, email, user, msg)
    return True

res = send("[email protected]", "Pesen", "发送成功”)  # 传递实参时,要按照形参指定的顺序来填写,否则使用了错误的参数,程序很有可能会出现错误。
if res is True:
    print("发送成功")
else:
    print("发送失败")

# 默认参数(默认参数必须放到最后定义,否则会报错)
def send(email, user=“Pesen", msg="发送成功”):  # 给user、msg两个形参指定默认值
    print(‘发送成功‘, email, user, msg)
    return True

res = send("[email protected]”)  # 不给send函数传递user,msg的实参,会使用默认值
if res is True:
    print("发送成功")
else:
    print("发送失败")

# 指定参数:可以打破实参传递的顺序
def send2(email, user, msg):
    print("邮件信息:", email, user, msg)
send2(user="Pesen", msg="OK", email="[email protected]")

# 动态参数

时间: 2024-11-08 18:23:02

Python学习之旅 —— 基础篇(三)set集合、函数、文件操作的相关文章

Python学习之旅 —— 基础篇(六)模

本篇要点: 模块   一.模块 模块是实现某个功能的代码集合 函数式编程则完成一个功能,其他代码用来调用即可,提供了代码的重用性和代码间的耦合.而对于一个复杂的功能来,可能需要多个函数才能完成(函数又可以在不同的.py文件中),n个 .py 文件组成的代码集合就称为模块.   模块的种类 模块分为三种:     内置标准模块(标准库)     第三方模块(开源模块)     自定义模块   1.自动以模块 & 导入模块 使用模块前需要先将模块导入,模块导入的方式: # 单模块,且在同一目录下,建

Python学习之旅 —— 基础篇(四)内置函数、装饰器

本篇要点: 内置函数 装饰器 一.内置函数 # abs() :取绝对值 >>> res = abs(-10) >>> print(res) 10 # 0,None,"",{},[],() 布尔值都为空 # all(),any() 判断值的真假 # all() 所有为真才为真 p = all([0,1,2,3]) # 0为False,所有p 是False print(p) # any() 任意一个为真即为真 p = any((0,""

Python学习之旅 —— 基础篇(五)字符串格式化、递归、生成器&amp;迭代器、模块

本篇要点:字符串格式化递归生成器和迭代器模块 一.字符串格式化 字符串格式化的两种方式:占位符 %, format函数1.占位符% %[(name)][flags][width].[precision]typecode - (name) 可选,用于选择指定的key - flags 可选,可供选择的值有: - + 右对齐:正数前加正好,负数前加负号: - - 左对齐:正数前无符号,负数前加负号: - 空格 右对齐:正数前加空格,负数前加负号: - 0 右对齐:正数前无符号,负数前加负号:用0填充空

Python学习之旅 —— 基础篇(八)面向对象

概述 面向过程:根据业务逻辑从上到下写垒代码 函数式:将某功能代码封装到函数中,日后便无需重复编写,仅调用函数即可 面向对象:对函数进行分类和封装,让开发“更快更好更强...” 对比示例:函数式变成和面向对象编程 连接数据库的增删改查 # 函数式编程 def slect(host, username, password, sql): pass def create(host, username, password, database): pass def remove(host, usernam

Python学习之旅 —— 基础篇(七)反射、冒泡排序算法

本篇要点: 冒泡算法 反射 一.冒泡排序 比较相邻的元素.如果第一个比第二个大,就交换他们两个. 对每一对相邻元素作同样的工作,从开始第一对到结尾的最后一对.这步做完后,最后的元素会是最大的数. 针对所有的元素重复以上的步骤,除了最后一个. 持续每次对越来越少的元素重复上面的步骤,直到没有任何一对数字需要比较. 代码示例: li = [5, 67, 2, 8, 5, 19, 6, 33, 98, ] times = len(li) for i in range(times): for j in

python学习[第十二篇] 数据类型之 集合

python学习[第十二篇] 数据类型之 集合 集合概念 python中集合是一组无序排列的哈希值.集合分为两种可变集合(set)和不可变集合(frozenset) 对可变集合可以修改和删除元素,对于不可变集合不允许.可变集合是不可以哈希的,因此既不能用作字典的键,也不能做其他集合的元素. 集合的增删改查 集合的创建于赋值 集合与列表([]) 和字典({})不同,集合没有特别的语法格式.列表和字典可以通过他们自己的工厂方法创建,这也是集合的唯一的创建方式.set()和frozenset() #创

python学习之路基础篇(三)

一.简单回顾上次课程内容 主要内容:str|list|dict 类---对象 具体内容可以参考: http://www.cnblogs.com/wupeiqi/articles/5433925.htmlhttp://www.cnblogs.com/wupeiqi/articles/5444685.html 二.python后续学习方法:首先整理课程讲解内容到博客,然后再写作业 三.本次课程内容 1.数据类型-set 小结: 列表和集合set的区别(小知识点):列表:有序 可重复 可嵌套集合set

Python学习总结之一 -- 基础篇

Python学习第一篇 一:写在前面 啊,最近我的新博客一直都没有更新学习内容了,只是最近一直都在忙着寻找实习机会(或许这只是一个借口,真实原因是我太懒惰了,改改改!).终于今天又投递了几个新的实习职位之后幡然醒悟,我的执行力还是太弱了,我得更加有自律性更加坚持才行.所以今天,我把之前学习的Python基础知识总结一下. 二:认识Python 首先我们得清楚这个:Python这个名字是从Monty Python借鉴过来的,而不是源于大家所知道的大蟒蛇的意思.我们为什么要学习Python呢?就我而

python学习之路基础篇(第四篇)

一.课程内容回顾 1.python基础 2.基本数据类型  (str|list|dict|tuple) 3.将字符串“老男人”转换成utf-8 s = "老男人" ret = bytes(s,encoding="utf-8") print(ret) ret1 = bytes(s,encoding="gbk") print(ret1) #程序运行结果如下: b'\xe8\x80\x81\xe7\x94\xb7\xe4\xba\xba' b'\xc0