#打印菱形
for i in range(5):
for j in range(5-i):
print(" ", end=" ")
for k in range(2 * i - 1):
print("*", end=" ")
print()
for i2 in range(5):
for j2 in range(i2):
print(" ", end=" ")
for k2 in range(2 * (5-i2) - 1):
print("*", end=" ")
k2+=1
print()
【例题3】
题目:有1、2、3、4个数字,能组成多少个互不相同且无重复数字的三位数?都是多少?
# 用于计数的变量
count = 0
# 使用三个循环生成三个不同的数字
for i in range(1, 5):
for j in range(1, 5):
for k in range(1, 5):
# 三位数字不重复才进行组合
if i != j and i != k and j != k:
# i组合第一位,j第二位,k第三位
print((i * 100) + (j * 10) + k)
# 组合一次就计数一次
count += 1
print(count)
【例题3】
使用python代码编写一个简单的爬虫:
'''
This is a spider
'''
from urllib import request
import re
class Spider():
# 目标页面
url = 'https://www.panda.tv/cate/kingglory'
# 如果不使用非贪婪模式就会匹配多个
root_pattern = '([\s\S]*?)'
name_pattern='</i>([\s\S]*?)</span>'
number_pattern='<span class="video-number">([\s\S]*?)</span>'
# 读取网页数据
def __fetch_content(self):
r = request.urlopen(Spider.url)
# 读出来的是字节
htmls = r.read()
htmls = str(htmls,encoding='utf-8')
return htmls
# 使用正则表达式匹配数据
def __analysis(self, htmls):
root_html = re.findall(Spider.root_pattern, htmls)
anchors = []
for html in root_html:
name = re.findall(Spider.name_pattern,html)
number = re.findall(Spider.number_pattern,html)
anchor = {'name' : name, 'number' : number}
anchors.append(anchor)
return anchors
# 数据精炼
def __refine(self, anchors):
l = lambda anchor: {
'name':anchor['name'][0].strip(),
'number':anchor['number'][0]
}
return map(l, anchors)
# 数据处理(排序)
def __sort(self, anchors):
# key指定排序元素
anchors = sorted(anchors, key=self.__sort_seed, reverse=True)
return anchors
# 排序种子
def __sort_seed(self, anchor):
r = re.findall('\d*', anchor['number'])
number = float(r[0])
if '万' in anchor['number']:
number *= 10000
return number
# 打印数据
def __show(self, anchors):
for rank in range(0, len(anchors)):
print('rank' + str(rank + 1) + ' : ' + anchors[rank]['name'] + '\t\t' + anchors[rank]['number'] + '人')
# 总控方法
def go(self):
htmls = self.__fetch_content()
anchors = self.__analysis(htmls)
anchors = list(self.__refine(anchors))
anchors = self.__sort(anchors)
self.__show(anchors)
s = Spider()
s.go()
from random import randint
# randint生成-10到10之间的随机数
data = [randint(-10,10) for _ in range(10)]
print(data)
# 需求:过滤列表中的负数
lists = filter(lambda x:x >= 0,data)
print(*lists)
# 第二种解法
lists2 = [x for x in data if x >= 0]
print(lists2)
# 列表推导式的性能要比filter高
【例题6】
筛出字典中值高于90的元素:
from random import randint
d = {x: randint(60, 100) for x in range(1, 21)}
print(d)
# 使用字典推导式实现
di = {k: v for k,v in d.items() if v > 90}
print(di)
【例题7】
过滤集合中能被3整除的子集:
from random import randint
data = [randint(-10,10) for _ in range(10)]
s = set(data)
print(s)
# 使用集合推导式实现
si = {x for x in s if x % 3 ==0}
print(si)
'''
很多应用程序都有浏览用户的历史记录功能,例如:
1.浏览器可以查看最近访问过的网页
2.视频播放器可以查看最近播放过的视频文件
3.shell可以查看用户输入过的命令
......
需求:制作一个简单的猜数字小游戏,需要添加历史记录功能,
能够显示用户最近5次猜过的数字,并且记录要持久存储
'''
from random import randint
import pickle
'''
使用容量为n的队列来存储历史记录,可以用到
collections中的deque,deque是一个双端循环队列
'''
from collections import deque
N = randint(0, 100)
# 运行程序时将文件数据导入
def get_history():
try:
with open('E:\\history.txt', 'rb') as history_txt:
history = pickle.load(history_txt)
if history :
return history
except FileNotFoundError as e:
# 第一个参数为队列的初始值,第二个参数为队列的容量
history = deque([], 5)
return history
# 猜数字
def guess(key):
if key == N:
print('right')
return True
if key < N:
print(key, 'is less-than N')
else:
print(key, 'is greater-than N')
return False
# 获得队列对象
history = get_history()
while True:
line = input('please input a number: ')
if line.isdigit():
key = int(line)
# append是从右边入队
history.append(key)
if guess(key):
break
# 当用户输入history或者h?时打印历史记录
elif line == 'history' or line == 'h?':
print(list(history))
elif line == 'exit':
# 程序退出前,可以使用pickle将队列对象存储到本地文件中
with open('E:\\history.txt', 'wb') as output:
pickle.dump(history, output)
break
实现一个可迭代对象的类,它能迭代出给定范围内所有素数:
'''
将该类的__iter__方法实现成生成器函数,每次yield返回一个素数
'''
class PrimeNumbers:
def __init__(self, start, end):
'''
初始化数字的范围
'''
self.start = start
self.end = end
def isPrime(self, k):
'''
判断是否是素数
'''
if k < 2:
return False
for i in range(2, k):
if k % i == 0:
return False
return True
def __iter__(self):
for k in range(self.start, self.end + 1):
# 是素数就返回
if self.isPrime(k):
yield k
for x in PrimeNumbers(1, 100):
print(x, end=' ')
【例题15】
实现一个连续浮点数发生器,根据给定范围和步进值产生一些列连续浮点数:
'''
实现一个连续浮点数发生器FloatRange,根据给定范围
和步进值产生一些列连续浮点数
'''
class FloatRange:
def __init__(self, start , end, step = 0.1):
self.start = start
self.end = end
self.step = step
def __iter__(self):
''' 正向迭代 '''
t = self.start
while t <= self.end:
yield t
t += self.step
def __reversed__(self):
''' 反向迭代 '''
t = self.end
while t >= self.start:
yield t
t -= self.step
for x in FloatRange(1.0, 4.0, 0.5):
print(x, end=' ')
print()
for x in reversed(FloatRange(1.0, 4.0, 0.5)):
print(x, end=' ')
【例题16】
使用readlines方法对迭代对象进行切片:
'''
有某个文本文件,我们想读取其中某范围的内容,如100~300行
之间的内容。python中文本文件是可迭代对象,我们是否可以
使用类似列表切片的方式得到一个100~300行文件内容的生成器?
'''
# 使用标准库中的itertools.islice,它能返回一个迭代对象切片的生成器
from itertools import islice
f = open('E:/test.txt')
# 迭代10到20行的内容
for line in islice(f, 10, 20):
print(line)
# 迭代前10行的内容
for line in islice(f, 10):
print(line)
# 迭代第10行到末尾行的内容
for line in islice(f, 10, None):
print(line)
lists = range(20)
t = iter(lists)
for x in islice(t, 5, 10):
print(x, end=' ')
【例题17】
'''
1.某班学生期末考试成绩,语文、数学、英语分别存储在3个列表中,同时
迭代三个列表,计算每个学生的总分数(并行)
'''
from random import randint
chinese = [randint(60, 100) for _ in range(40)]
math = [randint(60, 100) for _ in range(40)]
english = [randint(60, 100) for _ in range(40)]
# 第一种解决方案就是使用循环,通过下标拿出相应的值,进行计算,但是这种方式局限性很大
for i in range(len(chinese)):
chinese[i] + math[i] + english[i]
# 第二种方式就是使用内置函数zip,它能将多个可迭代对象合并,每次迭代返回一个元组
total = []
for c, m, e in zip(chinese, math, english):
total.append(c + m + e)
print(total)
【例题18】
'''
2.某年级有4个班,某次考试每班英语成绩分别存储在4个列表中,依次迭代
每个列表,统计全学年成绩高于90分的人数(串行)
'''
# 使用标准库中的itertools.chain,它能将多个可迭代对象进行连接
from itertools import chain
from random import randint
# 生成4个班的英语成绩
class1 = [randint(60, 100) for _ in range(40)]
class2 = [randint(60, 100) for _ in range(42)]
class3 = [randint(60, 100) for _ in range(39)]
class4 = [randint(60, 100) for _ in range(41)]
# 存储高于90分的人数
count = 0
for s in chain(class1, class2, class3, class4):
if s > 90:
count += 1
print('全学年成绩高于90分的人数为:' + str(count) + '人')
【例题19】
清除爱奇艺所有后台进程
import psutil
import os
import time
def search():
# 进程名称列表
process_list = ['QyFragment.exe', 'QyPlayer.exe', 'QyClient.exe', 'QyClient.exe', 'QyKernel.exe']
for proc in psutil.process_iter():
if proc.name() in process_list:
print(proc.name())
kill(proc.pid)
def kill(pid):
# 使用信号量kill进程
os.kill(pid, 9)
# 每秒检查一遍,直到杀干净为止
time.sleep(1)
search()
if __name__ == '__main__':
search()