Python之路_Day3
Python—Day3—课堂笔记
----------------------------------------------------------------------------------------------------
前期回顾:
前期回顾:
Python简介
Python入门
内容编码
注释
脚本参数传入
.pyc文件
变量的声明
用户输入(input)
流程控制(if...else...,缩进,循环,break,continue)
运算(+,-,*,/)
基本数据类型(数字,字符串,布尔值)
面向对象
str,list,tuple,dict
----------------------------------------------------------------------------------------------------
本期大纲:
一、set集合
—创建集合
—集合功能及操作
—练习
二、函数
— 自定义函数
— 自定义函数小练习
— 内置函数
----------------------------------------------------------------------------------------------------
一、set集合
set集合是一个无序且不重复的序列
1、创建集合
li = ["12","34","56",] #列表
dic = {"k":"v"} #字典
se = {"123","456"} #集合
s1 = {11,22}s2 = set()s3 = set([11,22,33,4])
>>> s = set()>>> li = [11,22,11,22]>>> s = set(li)>>> print(s){11, 22}
2、集合功能及操作
add #添加元素
add(self, *args, **kwargs)
>>> s = set()>>> print(s)set()>>> s.add(123)>>> print(s){123}
clear #清楚所有内容
clear(self, *args, **kwargs)
>>> s = {123}>>> print(s){123}>>> s.clear()>>> print(s)set()
copy #浅拷贝
copy(self, *args, **kwargs)
difference A中存在B中不存在
difference(self, *args, **kwargs)
>>> s1 = {11,22,33}>>> s2 = {22,33,44}>>> s3 = s1.difference(s2)>>> print(s3){11}>>> s3 = s2.difference(s1)>>> print(s3){44}
difference_update #从当前集合中删除和B中相同的元素
difference_update(self, *args, **kwargs)>>> s1 = {11,22,33}>>> s2 = {22,33,44}>>> s1.difference_update(s2)>>> print(s1){11}
symmetric_difference #对称差集
symmetric_difference(self, *args, **kwargs)>>> s1 = {11,22,33}>>> s2 = {22,33,44}>>> s3 = s1.symmetric_difference(s2)>>> print(s3){33, 11, 44, 22}>>> s4 = s2.symmetric_difference(s1)>>> print(s4){33, 11, 44, 22}
symmetric_difference_update #对称差集,并更新到a中
symmetric_difference_update(self, *args, **kwargs)>>> s1 = {11,22,33}>>> s2 = {22,33,44}>>> s1.symmetric_difference_update(s2)>>> print(s1){33, 11, 44, 22}
discard #移除某个元素,不存在不报错
discard(self, *args, **kwargs)>>> s1 = {11,22,33}>>> s1.discard(11)>>> print(s1){33, 22}
remove #移除某个元素,不存在会报错
remove(self, *args, **kwargs)>>> s1 = {11,22,33}>>> s1.remove(11111)Traceback (most recent call last): File "<input>", line 1, in <module>KeyError: 11111>>> s1.remove(11)>>> print(s1){33, 22}
pop #随机移除某个元素
pop(self, *args, **kwargs)>>> s1 = {11,22,33}>>> ret = s1.pop()>>> print(ret)33>>> print(s1){11, 22}#ret为删除的值
intersection #取交集,共同都有的
intersection(self, *args, **kwargs)>>> s1 = {11,22,33}>>> s2 = {22,33,44}>>> s3 = s1.intersection(s2)>>> print(s3){33, 22}
intersection_update #取交集并更更新到A中
intersection_update(self, *args, **kwargs)>>> s1 = {11,22,33}>>> s2 = {22,33,44}>>> s1.intersection_update(s2)>>> print(s1){33, 22}
isdisjoint #如果没有交集,返回True,否则返回False
isdisjoint(self, *args, **kwargs)>>> s1 = {11,22,33}>>> s2 = {22,33,44}>>> s1.isdisjoint(s2)False#有交集返回False>>> s1 = {11,22,33}>>> s2 = {44,55,66}>>> s1.isdisjoint(s2)True#没有交集返回True
issubset #是否是子序列
issubset(self, *args, **kwargs)>>> s1 = {11,22,33}>>> s2 = {44,55,66}>>> s1.issubset(s2)False
issuperset #是否是父序列
issuperset(self, *args, **kwargs)
>>> s1 = {11,22,33}>>> s2 = {44,55,66}>>> s1.issuperset(s2)False
union #并集
union(self, *args, **kwargs)>>> s1 = {11,22,33}>>> s2 = {22,33,44}>>> s3 = s1.union(s2)>>> print(s3){33, 22, 11, 44}
update #可以迭代
update(self, *args, **kwargs)>>> s1 = {11,22,33}>>> li = [11,22,3,11,2]>>> s1.update(li)>>> print(s1){3, 33, 2, 11, 22}>>> li = (11,22,3,11,2)>>> s1.update(li)>>> print(s1){3, 33, 2, 11, 22}>>> li = "sandler">>> s1.update(li)>>> print(s1){'a', 33, 2, 3, 'd', 'l', 'e', 11, 's', 22, 'r', 'n'}
3、练习
#!/usr/bin/env python# -.- coding: utf-8 -.-# by sandlerold_dice = {"#1":8,"#2":4,"#4":2,}new_dice = {"#1":4,"#2":4,"#3":2,}#应该删除那几个槽位#应该更新那几个槽位#应该增加那几个槽位new_set = set(new_dice.keys())old_set = set(old_dice.keys())remove_set = old_set.difference(new_set)add_set = new_set.difference(old_set)update_set = old_set.intersection(new_set)
----------------------------------------------------------------------------------------------------
二、函数
1、自定义函数
1)使用:
(1)、def关键字,创建函数
(2)、函数名
(3)、():
(4)、函数体
(5)、返回值
def 函数名():
函数体
返回值
函数示例,邮件发送:
#!/usr/bin/env python# -*- coding:utf-8 -*-# By Sandlerdef sendmail():try:import smtplibfrom email.mime.text import MIMETextfrom email.utils import formataddrmsg = MIMEText('邮件内容', 'plain', 'utf-8')msg['From'] = formataddr(["武沛齐",'wptawy@126.com'])msg['To'] = formataddr(["走人",'424662508@qq.com'])msg['Subject'] = "主题"server = smtplib.SMTP("smtp.126.com", 25)server.login("wptawy@126.com", "邮箱密码")server.sendmail('wptawy@126.com', ['3628905@qq.com',], msg.as_string())server.quit()except:# 发送失败return "失败"else:# 发送成功return "cc"ret = sendmail()print(ret)if ret == "cc":print('发送成功')else:print("发送失败")
2)参数:
普通参数(严格按照顺序,将实际参数赋值给形式参数)
>>> def f1(name):... print(name)...>>> f1('sandler')sandler>>> def f1(name,age):... print(name)... print(age)...>>> f1('sandler',18)sandler18
默认参数(必须放置在参数列表最后)
>>> def f1(name,age,job='IT'):... print(name)... print(age)... print(job)...>>> f1("sandler",18)sandler18IT>>> f1("sandler",18,"HR")sandler18HR
指定参数(将实际参数赋值给定值的形式参数)
>>> def f1(name,age,job='IT'):... print(name)... print(age)... print(job)...>>> f1(age=18,name="sandler",job="HR")sandler18HR
动态参数
'*args'(可以传入多个参数,转换成元祖,如果传入一个列表,则会把整个列表转化成一个元祖的元素,但如果列表前加上*,则会把列表的每一个元素转化成元祖的元素)
>>> def f1(*args):... print(args,type(args))...>>> f1(11)(11,) <class 'tuple'>>>> li = [11,22,33,44]>>> f1(li)([11, 22, 33, 44],) <class 'tuple'>>>> f1(*li)(11, 22, 33, 44) <class 'tuple'>>>> li = "sandler">>> f1(*li)('s', 'a', 'n', 'd', 'l', 'e', 'r') <class 'tuple'>
'**args'(动态指定参数,指定某个key和value,例:n1="sandler",传入后转化为字典,)
>>> def f1(**args):... print(args,type(args))...>>> f1(k1="v1"){'k1': 'v1'} <class 'dict'>>>> dic = { "k1":"v1","k2":"v2"}>>> f1(kk=dic){'kk': {'k2': 'v2', 'k1': 'v1'}} <class 'dict'>>>> f1(**dic){'k2': 'v2', 'k1': 'v1'} <class 'dict'>
万能参数(*args,**kwargs)
>>> def f1(*args,**kwargs):... print(args,type(args))... print(kwargs,type(kwargs))...>>> f1(11,22,33,44,k1="v1",k2="v2")(11, 22, 33, 44) <class 'tuple'>{'k1': 'v1', 'k2': 'v2'} <class 'dict'>
3)补充:
字符串格式化: .format(*args,**kwargs)
>>> s1 = "i am {0}, age {1}.".format("sandler", 18)>>> print(s1)i am sandler, age 18.>>> s2 = "i am {0}, age {1}".format(*["sandler", 18])>>> print(s2)i am sandler, age 18>>> s1 = "i am {name}, age {age}".format(name='sandler', age=18)>>> print(s1)i am sandler, age 18>>> dic = {'name': 'sandler', "age": 18}>>> s2 = "i am {name}, age {age}".format(**dic)>>> print(s2)i am sandler, age 18
全局变量:所有的作用域都可读,优先使用自己作用域的变量,
全局变量的变量名需要全部大写(潜规则)
对全局变量进行重新赋值,需要global
global 变量名 在任意作用域定义全局变量
特殊:列表字典,可修改,不可重新赋值
#!/usr/bin/env python# -.- coding: utf-8 -.-# By sandler'''def f1():name = "alex"print(name)def f2():print(name)name变量定义在f1函数中,所以只有f1函数可以读取,f2函数无法读取name变量'''NAME = "sandler"def f1():age = 18print(NAME,age)def f2():age = 19print(NAME,age)f1()f2()def f3():age = 18global NAME # 表示,name是全局变量NAME = "yuli"print(age, NAME)def f4():age = 19print(age, NAME)f3()f4()
4)三元运算:对于简单的 if else 语句,可以使用三元运算来表示,即:
if 1 == 1:name = "sandler"else:name = "yuli"name = "sandler" if 1 == 1 else "yuli"
5)lambda表达式:简单的函数,只能用一行
def func(arg):return arg + 1result = func(123)my_lambda = lambda arg : arg + 1result = my_lambda(123)
2、自定义函数小练习
编写一个用户登录程序,程序包含用户登录和用户注册,利用函数编写:
#!/usr/bin/env python# -.- coding:utf-8 -.-# By Sandlerdef login(username, password):"""用于用户登录:param username: 用户输入的用户名:param password: 用户输入的密码:return: true,表示登录成功;false,登录失败"""f = open("db", 'r')for line in f:line_list = line.strip().split("|")if line_list[0] == username and line_list[1] == password:return Truereturn Falsedef register(username, password):"""用于用户注册:param username: 用户输入的用户名:param password: 用户输入的密码:return: 默认None"""f = open("db", 'a')temp = "\n" + username + "|" + passwordf.write(temp)f.close()def main():t = input("1、登录;2、注册 : ")if t == "1":user = input("请输入用户名: ")pwd = input("请输入密码: ")r = login(user, pwd)if r:print("登录成功")else:print("登录失败")elif t == "2":user = input("请输入用户名: ")pwd = input("请输入密码: ")register(user, pwd)main()
3、内置函数
abs() 绝对值
>>> num = abs(3)>>> print(num)3
all() 所有为真,才为真
>>> num = all([1,2,3,None])>>> print(num)False>>> num = all([1,2,3])>>> print(num)True
any() 只要有真,就为真
>>> num = any([[],0,"",None])>>> print(num)False>>> num = any([[],1,"",None])>>> print(num)True
ascii() 忘掉他吧
# 按大王的至理名言来说”忘掉他吧“>>> class Foo:... def __repr__(self):... return "444"...>>> num = ascii(Foo())>>> print(num)444
bin() 十进制转二进制
>>> print(bin(8))0b1000
oct() 十进制转八进制
>>> print(oct(12))0o14
hex() 十进制转十六进制
>>> print(hex(14))0xe
bool() 布尔值,真或假
>>> print(bool(1))True>>> print(bool(0))False>>> print(bool(None))False>>> print(bool(()))False>>> print(bool([]))False>>> print(bool({}))False
bytes() 把字符串转换成字节类型,需要定义编码格式 例“n = bytes("李杰",encoding="utf-8")”
# utf-8 一个汉字:三个字节# gbk 一个汉字:二个字节# 字符串转换字节类型# bytes(只要转换的字符串, 按照什么编码)>>> name = "李杰">>> print(name)李杰>>> bytes_name = bytes(name,encoding="utf-8")>>> print(bytes_name)b'\xe6\x9d\x8e\xe6\x9d\xb0'>>> bytes_name = bytes(name,encoding="gbk")>>> print(bytes_name)b'\xc0\xee\xbd\xdc'
str() 把字节转换成字符串str(bytes("李杰",encoding="utf-8"),encoding="utf-8")
>>> name = "李杰">>> print(name)李杰>>> bytes_name = bytes(name,encoding="gbk")>>> print(bytes_name)b'\xc0\xee\xbd\xdc'>>> str_name = str(bytes_name,encoding="gbk")>>> print(str_name)李杰
open() 文件处理操作
操作文件是一般分为:打开文件、操作文件、关闭文件
(1)打开文件:
文件句柄 = open('文件路径', '模式')
打开文件时,需要指定文件路径和以何等方式打开文件,打开后,即可获取该文件句柄,日后通过此文件句柄对该文件操作。
打开文件的模式有:
r ,只读模式【默认】
w,只写模式【不可读;不存在则创建;存在则清空内容;】
x, 只写模式【不可读;不存在则创建,存在则报错】
a, 追加模式【可读; 不存在则创建;存在则只追加内容;】
"+" 表示可以同时读写某个文件
r+, 读写【可读,可写】
w+,写读【可读,可写】
x+ ,写读【可读,可写】
a+, 写读【可读,可写】
"b"表示以字节的方式操作
rb 或 r+b
wb 或 w+b
xb 或 w+b
ab 或 a+b
注:以b方式打开时,读取到的内容是字节类型,写入时也需要提供字节类型
f = open('db', 'r') # 只读f = open('db', 'w') # 只写,先清空原文件f = open('db', 'x') # 文件存在,报错;不存在,创建并只写f = open('db', 'a') # 追加f = open('db','r', encoding="utf-8")
(2)操作文件:
close(self, *args, **kwargs) #关闭文件
#!/usr/bin/env python# -.- coding:utf-8 -.-# By Sandlerf = open("db","r")#打开文件f.read()#读取文件f.close()#关闭文件
fileno(self, *args, **kwargs) #文件描述符
#! /usr/bin/env python# -.- coding: utf-8 -.-# By Sandlerf = open("db", 'r+')f.fileno()
flush(self, *args, **kwargs) #刷新文件内部缓冲区
#!/usr/bin/env python# -.- coding:utf-8 -.-# By Sandlerf = open("db", 'a')f.write("123")f.flush() #强制刷新写入上面的内容input("请输入: ") #等待用户输入
isatty(self, *args, **kwargs) #判断文件是否是同意tty设备
read(self, *args, **kwargs) #读取指定字节数据
#!/usr/bin/env python# -.- coding:utf-8 -.-# By Sandlerf = open("db","r")data = f.read()print(data)f.close()
readable(self, *args, **kwargs) #是否可读
readline(self, *args, **kwargs) #仅读取一行数据
#!/usr/bin/env python# -.- coding:utf-8 -.-# By Sandlerf = open("db","r")for line in f:print(line)#按行打印文件内容f.close()
seek(self, *args, **kwargs) #指定文件中指针位置
#!/usr/bin/env python# -.- coding:utf-8 -.-# By Sandlerf = open("db","r")f.seek(3) #指定指针位置为第三个字节
seekable(self, *args, **kwargs) #指针是否可操作
tell(self, *args, **kwargs) #获取指针位置
#!/usr/bin/env python# -.- coding:utf-8 -.-# By Sandlerf = open("db","r")print(f.tell()) #打印当前指针位置(字节)
truncate(self, *args, **kwargs) #截断数据,仅保留指定之前数据
#!/usr/bin/env python# -.- coding:utf-8 -.-# By Sandlerf = open("db", 'r+')f.seek(3) #指定指针位置f.truncate() #截断,指针位置后的数据清空f.close()
writable(self, *args, **kwargs) #是否可写
write(self, *args, **kwargs) #写内容
#! /usr/bin/env python# -.- coding: utf-8 -.-# By Sandlerf = open("db", 'w') #打开文件f.write("yuli") #先清空文件内容,再写入文件f.close() #关闭文件f = open("db", 'a') #打开文件f.write("alice") #追加写入文件到最后一行f.close() #关闭文件
----------------------------------------------------------------------------------------------------


浙公网安备 33010602011771号