吹静静

欢迎QQ交流:592590682

1、set 集合                    

 创建set集合 

# 创建一个集合
s1 = {11, 22}
s2 = set()     # 创建一个空集合。
s3 = set([11, 22, 33]

 向集合中添加元素 

s = set()
print(s)
s.add(123)    # 往集合里添加一个元素。
s.add(123)    # 重复查如是不允许的。
print(s)  

 clear 清除 

# clear 清除
s.clear()
print(s)      # 返回为空。

 difference 

# difference  A中存在,B中不存在。
s4 = {11, 22, 33}
s5 = {22, 33, 44}
s6 = s4.difference(s5)    # A中存在,B中不存在的。
print(s6)                 # 返回值 {11}

s7 = s4.symmetric_difference(s5)   # 把相同的去掉,不同的留下。
print(s7)                          # 返回值 {11,44}

s4.difference_update(s5)           # 把最新产生的结果拿出来更新到s4。
print(s4)                          # 返回值 {11}

 discard 移除选定的元素 

# discard 移除选定的元素
s11 = {11, 22, 33}
s11.discard(11)       # 移除11,如果要移除的元素不存在,不移除,不报错。
print(s11)            # 返回值 {33,22}

 remove 移除指定元素  

# remove 移除选定的元素
s12 = {11, 22, 33}
s12.discard(11)       # 移除11,如果要移除的元素不存在,报错。
print(s12)            # 返回值 {33,22}

 pop 随机移除并保存这个元素 

# pop 随机移除某个元素并保存这个元素
s13 = {11, 22, 33}
ret = s13.pop()     # pop 里面不能加参数
print(ret)

 intersection 取出A和B共有的元素 

# intersection 取出A和B共有的元素
s14 = {11, 22, 33}
s15 = {22, 33, 44}
s16 = s14.intersection(s15)
print(s16)

 union 把A,B合并起来 


# union 把A,B合并起来
s17 = s14.union(s15)    # 并集
print(s17)

 update 批量添加 

# update 批量添加
s14 = {11, 22, 33}
li = [1, 2, 3, 4]      # 还可以添加字符串、元组
s14.update(li)
print(s14)             # 输出{33, 2, 1, 3, 4, 11, 22}

 set 集合练习题 

old_dict = {
    "#1": 8,
    "#2": 4,
    "#4": 2,
}

new_dict = {
    "#1" : 4,
    "#2" : 4,
    "#3" : 2,
}
"""
 应该删除哪几个槽位
        1、old_dict存在,new_dict中不存在的    key
            old_keys = old_dict.keys()
            old_set = set(old_dict)      把字典转化成集合
            
            new_keys = new_dict.keys()
            new_set = set(new_keys) 
            
            old_set.diffrents(new_set)
 应该更新哪几个槽位
 应该增加哪几个槽位
"""
old_set = set(old_dict.keys())    # 字典转化成集合
new_set = set(new_dict.keys())

remove_set = old_set.difference(new_set)    # 找出old_dict里面存在的,new_dict里面不存在的
add_set = new_set.difference(old_set)       # 找出new_dict里面存在的,old_dict里面不存在的
update_set = old_set.intersection(new_set)  # 找出两个字典的交集
练习题

2、 函数                                                                               

 def cjj():
   1、def 关键字,创建函数
 2、函数名
 3、()
 4、函数体
 5、返回值

def sendmail(name, address, headline, content):

    import smtplib                       # 加载smtplib模块
    from email.mime.text import MIMEText
    from email.utils import formataddr
    my_sender = 'cjj2859090483@163.com'  # 发件人邮箱账号,为了后面易于维护,所以写成了变量
    my_user = address                    # 收件人邮箱账号,为了后面易于维护,所以写成了变量
    
    def sendmail():
        ret = True
        try:
            msg = MIMEText(content, 'plain', 'utf-8')
            msg['From'] = formataddr(["cjj.2859090483", my_sender])   # 括号里的对应发件人邮箱昵称、发件人邮箱账号
            msg['To'] = formataddr([name, my_user])                  # 括号里的对应收件人邮箱昵称、收件人邮箱账号
            msg['Subject'] = headline                                # 邮件的主题,也可以说是标题

            server = smtplib.SMTP("smtp.163.com", 25)              # 发件人邮箱中的SMTP服务器,端口是25
            server.login(my_sender, "sky.2859090483")               # 括号中对应的是发件人邮箱账号、邮箱密码
            server.sendmail(my_sender, [my_user], msg.as_string())  # 括号中对应的是发件人邮箱账号、收件人邮箱账号、发送邮件
            server.quit()                  # 这句是关闭连接的意思
        except Exception:                  # 如果try中的语句没有执行,则会执行下面的ret=False
            ret = False
        return ret

    ret = sendmail()
    if ret:
        print("ok")                 # 如果发送成功则会返回ok,稍等20秒左右就可以收到邮件
    else:
        print("filed")              # 如果发送失败则会返回filed


while True:
    name = input("请输入用户名:")
    address = input("请输入邮箱地址:")
    headline = input("请输入邮件标题:")
    content = input("请输入您要发送的内容:")
    result = sendmail(name, address, headline, content)

    if result == 'filed':
        print("发送失败")
    else:
        print("发送成功")
邮件发送

 函数参数传递 

def f1(a1, a2):
    return a1 + a2


def f1(a1, a2):
    return a1 * a2


ret = f1(8, 8)       # ret 接收返回值
print(ret)           # 函数执行a1 * a2, a1 + a2成为内存垃圾,在一定时间之后会被管理系统回收

########################################################################


def f2(a1):
    a1.append(999)


li = [11, 22, 44]
ret = f2(li)      # 函数参数传递的是引用,不是重新复制的一份数据

print(li)

 全局变量 

# 全局变量 在所有的作用域都可读
# 对全局变量进行重新赋值,需要global
# 特殊:列表、字典,可修改,不可重新赋值
"""
def f3():
    name = 'cjj'
    print(name)

def f4():
    print(name)    name 是私有变量,只能f1调用,f2不能调用
"""
NAME = 'cjj'    # 如果局部变量里面定义了跟全局变量相同的变量,先调用局部的变量,如果局部变量中没有,就调用全局变量
                # 定义全局变量一定要大写(规定)


def f1():
    age = 18
    # global NAME # 表示,name是全局变量,把name进行修改,对它重新赋值
    NAME = 'chui'
    print(age, NAME)


def f2():
    age = 19
    print(age, NAME)


f1()
f2()

 动态参数(1) *args 

# *  默认将传入的参数全部放置于元组中
# 形式参数前面加上一个*,那么就可以接收任意多个实际参数,并把它们转化成元组形式


def f1(*args):
    print(args)
    print(type(args))

f1(11, 22, 'cjj')
# 把列表当成一个元素插进去
list = [11, 22, 33, 44, 'chui']  # 不管传进去的是什么,* 都把它转化成元组
f1(list, 3)

f1(*list)     # 实参上加 *,把列表转化成一个个的元素传进去

li = 'cjj'  # 一个字符串作为实参
            # 其实 * 的作用就是做一个for循环,把里面的元素遍历一边
f1(*li)

 动态参数(2) **args  

# **  默认将传入的参数全部放置于字典中
# 参数的形参前面加 **
def f1(**args):     # ** 的功能是把传递进去的元素转化成字典
    print(args,type(args))

f1(n = "alex")      # 既然转化成字典,就要往里面传递一个key,一个value

dict = {1:'cjj',2:'chui'}
f1(**dict)          # 把字典传递进去,实质就是把字典循环,然后把一组组数据传递到定义的函数 

 lambda 计算简单函数

# lambda 只能用一行,简单的计算函数

def f1(a1):
    return a1 + 100
f2 = lambda a1, a2 = 9: a1 + 100 + a2   # 简化的函数,f2:函数名;a1:参数;a1+10:返回值;return被隐藏

ret = f1(10)
print(ret)

ret2 = f2(10)
print(ret2)

 几种常用的内置函数  

# abs() 绝对值
n = abs(-1)
print(n)

####################################################

# all()   所有的元素都为真,输出真
# any()   有一个元素为真,输出真

# 0,None,"",[],()   都是假的
# print(bool())     判断是真是假

n1 = all([1, 3, 4, None])
print(n1)      # 输出 False

m = any([1, 0, '', None])
print(m)

###################################################

# bin()  接收十进制,把十进制转化成二进制
# oct()  接收十进制, 转化成八进制
# hex()  接收十进制,转化成十六进制

print(bin(5))
print(oct(9))
print(hex(15))

##################################################

# bytes()  字符串转化成字节
# utf-8 一个汉字:三个字节
# gbk   一个汉字:二个字节
# 字符串转换字节类型
# bytes(要转换的字符串, 按照什么方式转码)

s = '吹静静'
n2 = bytes(s, encoding="utf-8")  # 把字符串 s 转化成 utf-8格式
print(n2)

n2 = bytes(s, encoding="gbk")  # 把字符串 s 转化成 utf-8格式
print(n2)

# str()  字节转换成字符串
n3 = str(b'\xe5\x90\xb9\xe9\x9d\x99\xe9\x9d\x99', encoding="utf-8")
print(n3)

 万能参数 *args,**kwargs  

# 必须是一个星的在前面,两个星的在后面
def f1(*args,**kwargs):
    print(args)
    print(kwargs)

f1(11,22,33,k1 = 'cjj',k2 = 'chui')  # 函数自动把前三个参数封装到*

 默认参数  

# 默认参数必须放在参数列表的最后面
def send(name, address, age = "ok"):    # 形参  age 是默认参数,如果不输入内容,自动赋值为ok
    print(name, address, age)
    print("发送邮件成功:", name, address)
    return True

send('cjj','大好人')      # 实参
send('cjj', '大好人', '23')

  注册与登陆

def login(username, password):
    """
    用于用户登陆
    :param username: 用户输入的用户名
    :param password:  用户输入的密码
    :return: true,表示登陆成功;false,表示登录失败
    """
    txt = open('db','r')     # 'r' 代表只读模式
    for line in txt:
        line_list = line.strip().split("|")     # strip() 移除空白及隐藏的换行符
        if line_list[0] == username and line_list[1] == password:
            return True
    return False


def register(username, password):
    """
    用于用户注册
    :param username: 用户名
    :param password: 密码
    :return: 默认返回None
    """
    txt = open("db",'a')      # 'a' 代表添加
    temp = "\n" + username + '|' + password
    txt.write(temp)
    txt.close()


def main():
    choose = input("1:登陆;2:注册")
    if choose == '1':
        username = input("请输入用户名:")
        password = input("请输入密码:")
        l = login(username, password)
        if l == True:
            print("登陆成功")
        else:
            print('登陆失败')

    elif choose == '2':
        username = input("请输入用户名:")
        password = input("请输入密码:")
        register(username, password)


main()
注册与登陆

3、文件操作                                 

文件基本操作流程

# 1、打开文件
f = open('cjj', 'a')

# 2、操作文件,通过源码查看功能

# 3、关闭文件
f.close()
  或者
with open('cjj') as f:
    pass

 文件读写操作——文件转码 

f = open('cjj', 'r')    # 如果文件打开出现乱码,很可能是文件保存方式有问题
# 改正:f = open('cjj', 'r', encoding="utf-8")  或者  f = open('cjj', 'r', encoding="GBK")
data = f.read()
print(data, type(data))
f.close()


f = open('cjj', 'rb')   # 加上 b 读到的是二进制,表现出来是字节类型
data = f.read()
print(data, type(data))
f.close()


f = open('cjj', 'ab')   # 以字节的形式添加
f.write(bytes("吹静静", encoding="utf-8"))
f.close()


f = open('cjj', 'a', encoding='utf-8')
f.write("吹静静")       # 开头标注用“utf-8”格式,添加的是字符串
f.close()

 文件操作 ——进阶  

"""
"+" 表示可以同时读写某个文件

    r+, 读写【可读,可写】
    w+, 写读【可读,可写】
    x+ ,写读【可读,可写】
    a+, 写读【可读,可写】

"""
# 如果打开模式为 r+ ,则read,按照字符读取;如果打开模式为 r+b ,则read,按照字节读取
f = open('cjj', 'r+', encoding='utf-8')
# 读取第一个字符
data = f.read(1)
# tell() 当前指针所在位置(永远是字节)
print(f.tell())
# seek() 调整当前指针的位置(永远是字节)
f.seek(f.tell())
# 从当前指针位置开始覆盖写入,不会移动后面数据的位置
f.write("666")   # 如果不加seek,默认在最后面追加
f.close()

  with  

"""
当with代码块执行完毕时,内部会自动关闭并释放文件资源。
"""
with open('cjj') as f:
    pass
# with 可以同时打开多个文件
# 读取txt1 前十行,写到txt2中前十行
with open('txt1', 'r', encoding='utf-8') as f1, open('txt2', 'w', encoding='utf-8') as f2:
    times = 0
    for line in f1:
        times += 1
        if times <= 10:
            f2.write(line)
        else:
            break

 4、str format 格式化输出

# str format 格式化输出

s = "i am {0}, age {1}".format("cjj", 23)    # {0},{1}是占位符,意思是先占下一段空的内存
s = "i am {0}, age {1}".format(*["cjj", 23])

print(s)

s1 = "i am {name},age {age}".format(name = 'cjj', age = 23)
print(s1)

dict = {'name': 'cjj', 'age': 23}
s2 = "i am {name},age {age}".format(**dict)
print(s2)

"""
输出: i am cjj,age 23
      i am cjj,age 23
      i am cjj,age 23
"""

5、三元运算                                              

# 三元运算,三目运算
"""
if 1 == 1:
    name = 'cjj'
else:
    name = 'SB'
"""

name = 'cjj' if 1 == 1 else "SB"  # 1==1 是一个判断条件,如果成立,name=cjj;如果不成立,name=SB

 

 

 

 

 

 

 

 

 

 

posted on 2017-12-13 20:09  吹静静  阅读(338)  评论(0编辑  收藏  举报