打印数字 print(1024)
打印字符串 print(“1024”)
python编码需要顶格编程
python 注释是#号
# 注释内容,#号后面有空格
变量名只能由字母、数字、下划线组成。
格式化输出:
name = "Tony"
print(f"My name is {name}")
转义字符: 左V括号
总结:
abc = "123";
print("abc") # 打印字符串,打印结果为:abc
print(abc) # 打印变量abc,打印结果为:123
print(f"{abc}") # 格式化打印,打印变量abc,打印结果为:123。
print(f"{abc}abc") # 格式化打印,打印变量abc和字符串"abc",打印结果为:123abc。格式化打印场景应该是:字符串拼接变量名的情况
python三引号用法可实现简单换行输出 实现与\n一样效果
print('''I
love
This
World''')
输出效果
I
love
This
World
python里面的特别打印:数字*字符串是连续打印字符串多次
print(3 * "18")
结果:
181818
当整型和整型进行加、减、乘法运算时,运算结果是整型。
当整型和整型相除,或者有浮点型参与运算时,运算结果都是浮点型。
/ 除
// 取整除
print(7//3) # 取整运算
print(7%3) # 取模运算
在python中, 没有隐式转换的概念,即 数字型与字符串型不能拼接。除了乘号的情况,代表打印字符串几次
print(3 * "18")
python中的真假都是首字母大写 True False
python中的逻辑运算都是小写 and or not
python中的 if没有括号,以: 结尾
if yourAge > myAge:
print("你的年龄比我大")
print("层级要")
if 变量 如果变量是非零非空,则为True
if:
do sth
else:
do sth
在判断语句中,对非零值判断为真;对数字0的判断为假;对 None 的判断为假。
python变量空值赋值是None
if:
do sth
elif:
do sth
else:
do sth
number = (-1, 3, 67, -9, 5, 6, 23)
print(number)
print(number[0])
print(number[2])
print(number[4])
数组是() 列表是[]
friendName = ["Kevin", "Tony", "Asum"]
print(friendName)
列表中的数据也可以是整型,浮点型,字符串或布尔数的任意组合。
如图所示,列表mixedList中,包含整型、浮点型和字符串三种数据类型。
切片要遵循“左闭右开”原则,就是取左边的数据,不取右边的数据,与数学中的区间类似[1, 3),取左不取右。
someLetters = ["a", "b", "c", "d", "e"]
print(someLetters[1:3])
()开辟的是数组,[]开辟的是列表
列表的api
append
insert(idx, val)
查找[]
删除pop del
添加append insert(idx, val)
修改[]=
pop与del不同点
pop可提取删除的数据,赋值给另一个变量
pop可以删除列表的最后一个元素
del直接删除列表里的元素,无法提取或保存
字典的api
查找[]
删除pop
添加[]=
修改[]=
我们还可以通过"keys()"功能获取这个字典所有的键。
除了使用“keys()”以外,我们也可以通过in运算来检查字典是否包含某个键。
定义方式
定义元组、列表和字典的方式如图所示,分别使用小括号 () 、方括号 [] 和花括号 {} 。
三种数据结构的每一项元素都是由逗号分隔开。
对于元组和列表来说,除了访问单个元素外,还可以使用切片来截取多个连续的元素。
今天,我们从以下几个方面复习了元组(tuple)、列表(list)和字典(dict):
in运算符
想要快速判断列表或者元组中是否有某一个元素,可以使用in运算符。
in运算符的左边是要查找的元素,右边是定义的元组或列表。
in运算的结果,是一个布尔值(True/False)。
遍历字典的键 for 循环遍历字典的键,有两种方法可以使用:
for i in state和 for i in state.keys()对于遍历字典state的效果是一样的。
累加器
names = ["Tim", "Amy", "Eva"]
count = 0
for name in names:
count = count + 1
print(f"第{count}名是{name}")
for循环和while循环的区别
\1. for循环常用于处理列表内的每个元素。
\2. for循环有天然的边界条件,while循环没有,需要我们精心设计边界条件。
\3. 大多数时候,for循环和while循环可以互换使用。
# 学生成绩列表
mark = [56,78,73,92,87,98,28,91,85,70,66,45,93]
min = mark[0]
max = mark[0]
for m in mark:
if max < m:
max = m
if min > m:
min = m
print(f"本班最高分为{max},最低分为{min}")
break直接终止整个循环结构; continue是跳过当前循环中剩下的代码,继续进入下一次循环。
for i in range()的功能是:遍历一个整数列表。
其中range()的功能是:创建一个整数列表。
例如:range(5)可以生成一个从0 开始到5结束但不包括5的整数列表[0,1,2,3,4]。
range(5)可以生成从0到4的整数列表。
如果我们需要生成从1到4的整数列表,只需要在range(5)中添加一个初始计数值1,改成range(1,5)就可以啦。
range与切片的区别:
range是生成整数列表,切片是对元组/列表进行切割。
for i in range(1, 10): for j in range(1, i + 1): print(f"{i}*{j}={i*j}")
这是一道经典编程题,通过1,2,3,4四个数字进行组合,一共会有多少种三位数? 输出所有的三位数组合。 备注:每个数字可以使用多次。
for i in range(1, 5): for j in range(1, 5): for k in range(1, 5): res = i * 100 + j * 10 + k print(res)
无参函数
def sayWelcome():
print("欢迎光临")
print("商品一律九折")
sayWelcome()
sayWelcome()
有参函数
def sayWelcome(discount):
print("欢迎光临")
print(f"商品一律{discount}")
sayWelcome("九折")
sayWelcome("五折")
函数经过内部代码的执⾏会产⽣⼀个结果,这个结果可以是⼀个具体的值也可以是多个值。
在本例中,函数计算出正⽅形的周长和面积,函数返回了两个值。
当函数同时返回多个值时,以逗号 “,” 隔开,并且返回值以元组的格式返回。
必选参数
默认参数
必选参数 vs 可选参数
匿名函数定义:
匿名函数是一种不需要为函数命名的函数定义方式,以 lambda 关键字开头。
power = lambda x:x*x*x
print(power(5))
area = lambda l,w,h : l*w*h
print(area(10, 8, 6))
匿名函数不适合处理复杂代码块
递归
匿名函数使用判断表达式
偶数归零定义匿名函数,传入参数x,通过模2运算判断参数x是奇数还是偶数,若为奇数,返回参数x,否则返回0值。
最后,通过参数x为11调用并输出结果。
square = lambda x:x if x % 2 == 1 else 0print(square(11))
递归求和编写一个函数func(),传入参数x,x为列表,使用func()计算参数x内元素的和。
函数内首先判断x是否为空列表,若为空则返回0值,其余利用递归返回列表中第一个值到最后一个值的和。
最后,利用传入参数x为 [1,2,3,4,5]调用函数func(),输出结果。
def func(x): if x == []: return 0 else: return x[0] + func(x[1:])print(func([1,2,3,4,5]))
每日花一半小米有10000块钱,每天花一半,能花多少天呢?
编写一个名为cost() 的函数,传入两个参数分别为money和day,计算参数money最多可以花多少天。
当money小于或者等于0时,返回f"钱花完了,花了{day}天"。 注意:参数money除2时需要取整,以保证有限次递归。
def cost(money, day): if money <= 0: return f"钱花完了,花了{day}天" else: day += 1 money //= 2 return cost(money, day) print(cost(10000, 0))
类代表一些拥有相同特性与功能的事物,如鸟类,人类,猫类等。
类中的某一个具体实例称为这个类的实例对象,简称为对象。
class Phone(): def makeCall(self, who): return f"正在拨打电话给{who}" def sendMsg(self, who, txt): return f"正在发送短信给{who}, 内容为{txt}"myPhone = Phone()yourPhone = Phone()ret = myPhone.makeCall("Tony")print(ret)ret2 = yourPhone.sendMsg("Jeremy", "中午吃啥?")print(ret2)
class Phone(): def __init__(self, bd, clr): print("创建实例对象时,自动调用此方法") self.brand = bd self.color = clr
汽车信息
创建一个类Car,用来存储有关汽车的信息。初始化以下信息,品牌brand,型号model,购买年份year。 创建getCarInfo()方法,用来返回汽车的基础信息。
创建一个参数为"Audi",“A6L”,"2019"的对象,调用该对象的getCarInfo()方法,输出对应的汽车基础信息。(注意: 各信息之间用英文空格隔开哦~)
输出示例: Audi A6L 2019
class Car(): def __init__(self, brand, model, year): self.brand = brand self.model = model self.year = year def getCarInfo(self): return self.brand + " " + self.model + " " + self.yearmyCar = Car("Audi", "A6L", "2019")print(myCar.getCarInfo())
from datetime import datetodayDate = date.today()print(todayDate)
使用 from…import… ,从datetime模块中导入date类。
获取今天日期的年份,并判断跟实际今年的年份(2021)是否相等。相等输出True,不相等输出False。
from datetime import dateyear = date.today().yearprint(year == 2021)
在Windows命令提示窗口里,使用 pip install「ModuleName」命令安装第三方模块。
path = "/Users/aLing/bobo.jpg"with open(path,"rb") as imageFile: print(imageFile)
由于我们要打开一张图片,在这里打开方式为:rb。rb 表示以只读的方式读取二进制文件,即 Read Binary 的缩写。
open() 函数在读取文件时,有时候会发生异常。为了能在发生异常时,自动释放打开的文件资源,我们可以搭配使用 with…as…语句。
使用 with…as…语句,首先执行 with 后面的 open() 函数,返回值会赋给 as 后面的变量。
现在在程序中能够批量打开图片,接下来就要批量读取图片。
在这里,我们可以调用 read() 函数,read() 函数可以逐个字节(或者逐个字符)读取文件中的内容。
由于是以二进制格式打开图片,所以读取的图片内容是二进制格式。
path = "/Users/aLing/bobo.jpg"with open(path,"rb") as imageFile: print(imageFile.read())
# 发件人、收件人sender = "aLing@qq.com"receiverDict = {"xixi":"adc@yequ.com", "kiki":"def@yequ.com", "feifei":"hij@yequ.com", "bobo":"klm@yequ.com", "cici":"opq@yequ.com", "huahua":"rst@yequ.com", "yeye":"uvw@yequ.com", "jingjing":"xyz@yequ.com", "tongtong":"yza@yequ.com"}# 将文件路径/Users/aLing,赋值给变量pathpath = "/Users/aLing"# for 循环遍历字典receiverDict,将键赋值给变量receiverfor receiver in receiverDict: # 将字符串path + "/"+ receiver + ".jpg"拼接,赋值给变量filePath filePath = path + "/"+ receiver + ".jpg" # 使用with...as以rb方式,打开路径为filePath的图片,并赋值给imageFile with open(filePath, "rb") as imageFile: # TODO 使用read()读取imageFile,赋值给变量fileContent fileContent = imageFile.read() # TODO 使用print()输出变量fileContent print(fileContent)
练习一:
with…as 语句配合 open() 函数的方式,读取一个txt文件。
由于要打开一个txt文件,在open()函数中打开方式为"r"。
文件路径: “/Users/file/诗句.txt”
with open("/Users/file/诗句.txt", "r") as txtFile: print(txtFile.read())
代码的作用
登录邮箱需要使用 smtpObj 调用方法 login() ,该方法中需要传入两个参数,一个是登录的账号,一个是该账号的授权码。
代码的拆解
导入模块中的类后,我们来学习怎么运用。
\1. MIMEMultipart 负责整合邮件内容。
message = MIMEMultipart() —— 表示实例化一个 MIMEMultipart 对象,赋值给 message ,便于后面将邮件信息写入变量中。
\2. Header 负责编辑邮件内容。
message[“From”] = Header(“阿玲aLing@qq.com”)
表示先实例化一个 Header 对象,传入发件人信息;然后将发件人信息,赋值给 message[“From”]。
发送邮件使用 sendmail(),传入三个参数:
\1. 发件人邮箱 sender; \2. 收件人邮箱 receiverDict[receiver]; \3. 邮件内容 message.as_string(),使用 as_string() 方法将message设置为文本格式。
整理本节课代码,点击「run」运行即可。
对应右侧代码,尝试使用自己的帐号和授权码,修改收件人信息,在本地发送一封简单的邮件吧。
注意:课程中的发件人和收件人帐号均不能使用,否则会报错。
# 使用import导入smtplib模块
import smtplib
# 使用 from...import 从 email.header 导入Header
from email.header import Header
# 使用 from...import 从 email.mime.multipart 导入MIMEMultipart
from email.mime.multipart import MIMEMultipart
# 邮箱帐号设置,"aLing@qq.com"赋值给mailUser
mailUser = "aLing@qq.com"
# 邮箱授权码设置,"abcnawckdujkdace"赋值给mailPass
mailPass = "abcnawckdujkdace"
# 使用smtplib.SMTP_SSL(服务器, 端口号),端口号为465,赋值给smtpObj
smtpObj = smtplib.SMTP_SSL("smtp.qq.com", 465)
# 使用login()函数传入邮箱账户和授权码,登录邮箱
smtpObj.login(mailUser, mailPass)
# 发件人、收件人
sender = "aLing@qq.com"
receiverDict = {"xixi":"adc@yequ.com", "kiki":"def@yequ.com","tongtong":"yza@yequ.com"}
# for 循环遍历字典receiverDict,将键赋值给变量receiver
for receiver in receiverDict:
# 实例化 MIMEMultipart 对象,赋值给message
message = MIMEMultipart()
# 将发件人信息写入 message["From"]
message["From"] = Header(f"阿玲<{sender}>")
# 将收件人信息写入 message["To"]
message["To"] = Header(f"{receiver}<{receiverDict[receiver]}>")
# 将主题写入 message["Subject"]
message["Subject"] = Header(f"{receiver}-年会邀请函")
# 使用sendmail(发送人,收件人,message.as_string())发邮件
smtpObj.sendmail(sender, receiverDict[receiver], message.as_string())
# 使用print()输出"发送成功"
print("发送成功")
邮件正文需要创建 MIMEText 实例,传入三个参数:
\1. 正文:“Dear xx,邀请你参加年会。”;(可根据实际情况编辑内容。) \2. 文本类型:“plain”; \3. 编码:“utf-8”。
整理批量发送邮件的代码,如图所示,复习相关知识点,点击「run」直接运行代码即可。
# 导入所需模块
import smtplib
from email.header import Header
from email.mime.multipart import MIMEMultipart
from email.mime.text import MIMEText
from email.mime.image import MIMEImage
# 邮箱帐号和授权码,连接和登录邮箱
mailUser = "aLing@qq.com"
mailPass = "abcnawckdujkdace"
smtpObj = smtplib.SMTP_SSL("smtp.qq.com", 465)
smtpObj.login(mailUser, mailPass)
# 发件人、收件人
sender = "aLing@qq.com"
receiverDict = {"xixi":"adc@yequ.com", "kiki":"def@yequ.com","tongtong":"yza@yequ.com"}
# 文件路径
path = "/Users/aLing"
for receiver in receiverDict:
# 编辑并整合发件人、收件人、主题信息
message = MIMEMultipart()
message["From"] = Header(f"阿玲<{sender}>")
message["To"] = Header(f"{receiver}<{receiverDict[receiver]}>")
message["Subject"] = Header(f"{receiver}-年会邀请函")
# 编辑邮件正文
mailContent = MIMEText(f"Dear {receiver} 邀请你参加年会", "plain", "utf-8")
# 读取图片文件
filePath = path + "/" + receiver + ".jpg"
with open(filePath, "rb") as imageFile:
fileContent = imageFile.read()
# 编辑附件信息
att = MIMEImage(fileContent)
att.add_header("Content-Disposition", "attachment", filename="邀请函.jpg")
# 整合正文和图片
message.attach(mailContent)
message.attach(att)
# 发送邮件
smtpObj.sendmail(sender, receiverDict[receiver], message.as_string())
print("发送成功")
定义
网络爬虫,是指“按照一定规则自动抓取网页信息的程序”。
定义
数据分析,是将隐藏在一大批看来杂乱无章的数据中的信息 集中 和 提炼 出来。
从而找出数据的内在规律,发现洞见,驱动人的决策。
一个数据分析的流程,包括了数据清洗,描述性分析,探索性分析。
No.098通过率:90.58%困难
最后一个人
有50个人围成一圈,顺序排号。从第一个人开始,按1到3循环报数,凡报到3的人退出圈子,问最后留下的那个人是在原来的50人中排第几号。
def jump(n, k):
List = list(range(1, n + 1))
index = 0
while List:
tmp = List.pop(0)
index += 1
if index == k:
index = 0
continue
List.append(tmp)
if len(List) == 1:
print(List[0])
break
jump(50, 3)
No.099通过率:78.90%💊 挑战
手机靓号
定义一个函数phoneNo()完成随机生成手机号的功能,传入参数operator(运营商类型,包括四川移洞、四川连通、四川电兴),chooseType(选号类型,包括选取靓号、普通选号)。本题需要导入random模块,以及使用模块中的randint()函数哦!
手机号要求: 第一位数为:1;
第二位数为:3, 5, 7, 8, 9中的任意一个;
第三位数取决于第二位数: 如果第二位数为3或者8,则第三位数为0-9中的任意一个; 如果第二位数为5,则第三位数为除去4以外的0-9中的任意一个; 如果第二位数为7,则第三位数为除去4,9以外的0-9中的任意一个; 如果第二位数为9,则第三位数为8、9中的任意一个;
第四位数: 如果operator为"四川移洞",则第四位数为5, 7, 8, 9中任意一个; 如果operator为"四川连通",则第四位数为0, 2, 5, 6, 9中任意一个; 如果operator为"四川电兴",则第四位数为3, 7, 9中任意一个; 如果operator为其他字符串,则输出"没有该种营运商类型"。
最后七位: 如果chooseType为"选取靓号",则最后七位为6666666,8888888,9999999中任意一个; 如果chooseType为"普通选号",则最后七位随机生成七位数; 如果chooseType为其他字符串,则输出"没有该种选号类型"。
最后通过参数"四川连通",“选取靓号"调用手机号码生成函数phoneNo(),如果生成的num为"19999999999”,则输出"我要办理该手机号,号码为:19999999999",否则,输出"该号码不是我想要的号码,我不办理"。
import random
def phoneNo(operator,chooseType):
#第二位数字为3,5,7,8,9中任意一个
two =random.choice([3,5,7,8,9])
#第三位数取值
if (two == 3) or (two == 8):
three = random.randint(0,9)
elif two == 5:
three = random.choice([0,1,2,3,5,6,7,8,9])
elif two == 7:
three = random.choice([0,1,2,3,5,6,7,8])
elif two == 9:
three = random.choice([8,9])
#第四位数取值
if operator == "四川移洞":
four = random.choice([5,7,8,9])
elif operator == "四川连通":
four = random.choice([0,2,5,6,9])
elif operator == "四川电兴":
four = random.choice([3,7,9])
else:
print("没有该种运营商类型")
#最后七位数取值
final = ""
if chooseType == "选取靓号":
final = random.choice([6666666,8888888,9999999])
elif chooseType == "普通选号":
for i in range(8):
final = final + random.radint(0,9)
return final
phoneNumber = "1" + f"{two}{three}{four}{final}"
return phoneNumber
num = phoneNo("四川连通","选取靓号")
if num == 1999999999:
print("我要办理该手机号,号码为:1999999999")
else:
print("该号码不是我想要的号码,我不办理")
No.100通过率:90.64%😈 地狱
二维码设计
Python 社区中有数以万计强大的模块,我们无法一一解释说明。但通过查找与阅读相关文档,结合对Python语法的掌握就可以轻松的上手。
接下来让我们尝试一下:
现如今,我们的生活已经离不开对二维码的使用。
在Python中有一个强大的二维码处理模块MyQr。
通过阅读MyQr模块的文档MyQr模块的文档,将给定的内容与图片制作成一张彩色二维码。
from MyQR import myqr
# 图片的路径
img_path = '/Users/image/cute.jpg'
# 二维码要展示的数据链接
data = "https://shimo.im/docs/nTQ5XVG3NEoyNIGl/readX"
# 二维码要保存的位置
file_path = "/Users/image/"
# 二维码要保存的名称
file_name = "myQR.png"
# TODO 将制定的图片与数据生成一个彩色的二维码图片myQR.png
version, level, qr_name = myqr.run(data, save_name=file_name,save_dir=file_path, picture=img_path)
[参考资料] 1.夜曲编程Python入门课程Pro