三目运算:
>>> 1 if 5>3 else 0 1 >>> 1 if 5<3 else 0 0
深浅拷贝:
一、数字和字符串
对于 数字 和 字符串 而言,赋值、浅拷贝和深拷贝无意义,因为其永远指向同一个内存地址。
import copy # ######### 数字、字符串 ######### n1 = 123 # n1 = "i am alex age 10" print(id(n1)) # ## 赋值 ## n2 = n1 print(id(n2)) # ## 浅拷贝 ## n2 = copy.copy(n1) print(id(n2)) 22219144 # ## 深拷贝 ## n3 = copy.deepcopy(n1) print(id(n3)) 22219144
二、其他基本数据类型
对于字典、元祖、列表 而言,进行赋值、浅拷贝和深拷贝时,其内存地址的变化是不同的。
1、赋值
赋值,只是创建一个变量,该变量指向原来内存地址,如:
n1 = {"k1": "wu", "k2": 123, "k3": ["alex", 456]} n2 = n1
2、浅拷贝
浅拷贝,在内存中只额外创建第一层数据
import copy n1 = {"k1": "wu", "k2": 123, "k3": ["alex", 456]} n3 = copy.copy(n1)
3、深拷贝
深拷贝,在内存中将所有的数据重新创建一份(排除最后一层,即:python内部对字符串和数字的优化)
import copy n1 = {"k1": "wu", "k2": 123, "k3": ["alex", 456]} n4 = copy.deepcopy(n1)
函数扩展:发送邮件实例
def emil(p): import smtplib from email.mime.text import MIMEText from email.utils import formataddr msg = MIMEText('邮件内容', 'plain', 'utf-8')
# From 后面的邮箱地址一定要跟发送邮箱地址相同,不然会认证失败 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', [p,], msg.as_string()) server.quit email("244591052@qq.com")
加密(hashlib)
import hashlib # 设置自己的加密字符串,防止他人撞库破解 hash = hashlib.md5(bytes('sfa',encoding='utf-8')) # 设置加密的密码 hash.update(bytes('123',encoding="utf-8")) print(hash.hexdigest()) # b72a6beb24eef36c247274014dd4ade3
import hashlib def md5(arg): hash = hashlib.md5(bytes('licheng', encoding='utf-8')) # 设置加密的密码 hash.update(bytes(arg, encoding="utf-8")) return hash.hexdigest() def register(user,pwd): with open("db",'a',encoding="utf-8") as f: temp = user + "|" + md5(pwd)+ " " f.write(temp) def login(user,pwd): with open("db","r",encoding="utf-8") as f: for line in f: u, p = line.strip().split("|") if u == user and p == md5(pwd): return True choose = input("1.登录 2.注册") if choose == "2": user = input("用户名:") pwd = input("密码:") register(user,pwd) elif choose == "1": user = input("用户名:") pwd = input("密码:") judge = login(user,pwd) if judge: print("登陆成功") else: print("登录失败")
enumrate
>>> for i,j in enumerate([1,2,3]): print i,j 0 1 1 2 2 3 >>> for i,j in enumerate({'a':1,'b':2}): print i,j #字典默认遍历key 0 a 1 b
li = ['冰箱','彩电','洗衣机'] # 可以指定序号从什么开始计数 for index,i in enumerate(li,1): print(index,i) # 1 冰箱 # 2 彩电 # 3 洗衣机 # 虽然显示是从1开始,但系统内还是以0开始计数的
range,xrange
>>> range(1,5) #代表从1到5(不包含5) [1, 2, 3, 4] >>> range(1,5,2) #代表从1到5,间隔2(不包含5) [1, 3] >>> range(5) #代表从0到5(不包含5) [0, 1, 2, 3, 4]
python2中:
range——获取指定范围内的数,且立刻在内存中生成
xrange——获取指定范围内的数,但只有在for循环调用的时候才在内存中生成,节省内存
python3中:
舍弃了xrange,python3中的range相当于Python2中的xrange。
内置函数:
print(__name__) #本文件被执行时输出__main__,否则输出模块名 print(__doc__) #输出 py 文件的注释 print(__file__) # 输出自己文件的路径 #可以配合常用os操作完成系统路径的修改: p1 = os.path.dirname(__file__) p2 = "lib" my_dir = os.path.join(p1, p2) sys.path.append(my_dir) print(__package__) # 输出当前.py所在文件夹,用.划分
小知识点
- 对于字符串,执行一个功能,生成一个新内容,原来的内容不变。
- 对于list、tuple、dict,执行一个功能,自身进行变化。