小项目集合(练习持续更新)

成员运算

#1)移除 name 变量对应的值两边的空格,并输出处理结果#
name = "jason"
res = name
print(res.strip())

# 2)判断 name 变量对应的值是否以 "ja" 开头,并输出结果#
name = "jason"
res = name
print(res.startswith("ja"))

# 3)判断 name 变量对应的值是否以 "N" 结尾,并输出结果#
name = "jason"
res = name
print(res.endswith("N"))

# 4)将 name 变量对应的值中的 “a” 替换为 “b”,并输出结果#

name = "jason"
print(name.replace('a','b'))

# 5)将 name 变量对应的值根据 “a” 分割,并输出结果。#
name = "jason"

print(name.split('a'))

队列与堆栈的区别

#队列
# a = []
# a.append(12)
# a.append(23)
# a.append(34)
# print(a.pop(0))
# print(a.pop(0))
# print(a.pop(0))
#堆栈
a = []
a.append(1)
a.append(2)
a.append(3)
print(a.pop())
print(a.pop())
print(a.pop())

两个列表如何找出两者的相同元素和不同元素


list1 = [1, 2, 3]
list2 = [3, 4, 5]
#先把列表转成集合,用set表示
a = set(list1)
b = set(list2)
#交集用& 差集用^
print(a & b)
print(a ^ b)

⽤户数据列表如下


# 获取⽤户输⼊的⽤户名和密码校验是否正确,如正确则打印登录成功错误则打印⽤户名或密码错误
list = [['jason', 123], ['kevin', 123], ['tony', 123]]
 a = dict(list) #  print(a) 把列表转换成字典 {'jason': 123, 'kevin': 123, 'tony': 123}
 b =[]   #创建一个空列表
 for i in a:
     b.append(i)   #扩展b列表 把i 放进空列表  b=新列表
 while True:
     n = input('your name>>>:')
     p = input('your password>>>:')
     if n in b and p == '123':         #如果变量n在列表里和p等于123
         print('登录成功')
         break
     else:
         print('错误')
         break

循环

# 循环获取⽤户的⽤户名和密码
# 如果⽤户名为jason并且密码是123则打印欢迎⽼板
# 之后循环获取⽤户指令,
# 并打印正在执⾏该指令直到⽤户输⼊q退出执⾏指令 重新回到获取⽤户信息处

#定义如果用户名等于jason 密码等于123  再循环内嵌
for i in range(3):
    u = input('name>>>:')
    p = input('password:')
    if u == 'jason' and p == '123':
        print('欢迎老板')
    else:
        print('fuck you ')
        continue
    for i in range(5):
        choice = input('正在执行该命令')
        if choice == 'q':
            break

编写猜年龄的游戏拔⾼版本

#     1、必写
#         错误的情况下只能才三次
#         正确的情况下直接推出游戏
#     2、拔高
#         三次错误之后提示用户三次机会已用完
#         问他是否继续  如果继续则再给三次机会
#         如果不继续则直接退出

age = "18"       #定义:年龄等于18 开始次数为0
count = 0
for i in range(3):   #当次数小于3次时  取变量sum1 当sum1等于age18时 提示猜对 结束游戏
    sum1 = input("年龄是:")
    if sum1 == age:
        print("你TM猜对了")
        break
    else:         #反之猜错,次数加1  当次数等于3次时提示是否继续
        print("你TM猜错了")
        count += 1    #增加次数:+=  (上面说了count=0  那就是从0开始+1+1+1)
        if count == 3:
            print('是否继续,继续输入Y,结束输入N') #先打印后循环
            while True:
                inp = input('输入指令')   #输入变量inp 当inp为Y 次数为o重新上一轮的循环
                if inp == "Y":
                    print('重来')
                    cot = 0
                    while cot < 3:
                        inp_age = input("年龄")
                        if inp_age == age:
                            print("猜对了")
                            break
                        else:
                            print("err")
                            cot += 1
                    break

编写⽤户注册功能

# 使⽤列表套字典形式存储⽤户数据
# user_info = [{},{},{}...]
# 循环注册⽤户信息,每完成⼀次注册列表中就以字典形式维护⽤户信息 ⽤户信息的获取⾄少有⽤户名和密码
#z =[{'name': 'jason', 'pwd': 123}, {'name': 'tony', 'pwd': 123}]
user_info = []
# 循环
while True:
    # 获取用户输入的用户名,密码和确认密码
    in_name = input('请输入用户名:').strip()
    in_psd = input('请输入密码:').strip()  
    re_psd = input('请确认密码:').strip()
    # 如果密码和确认密码不同,则让用于重新输入
    if in_psd != re_psd:                  #!= 是不等于
        print('请输入相同的密码,傻叉')
        continue

    # 遍历user_info中的每个元素,每个元素都是字典
    for item in user_info:
        # 判断用户名是否等于字典中的name
        # 如果有相等的说明用户已经被注册
        if in_name == item.get('name'):

            print('该用户已存在请重新注册')
            # 中断for循环,重新输入
            break
    else:
        # 如果都不相等,那么创建新字典,将in_name和in_psd分别对应name和pwd
        d = {'name': in_name, 'pwd': in_psd}
        # 将字典作为一个元素添加到列表中
        user_info.append(d)
        # 打印注册成功
        print('注册成功')
        print(user_info)

ATM外框

def login():
    print('登入功能')

def transfer():
    print('转账')

def check_banlance():
    print('查询余额')

def register ():
    print('注册')

func_dic={
    '1':login,
    '2':transfer,
    '3':check_banlance,
    '4':register1
}
while True:
     print("""
   0 退出
   1 登入
   2 转账
   3 查询余额
   4 注册
    """)
     choice = input('请输入命令编号,傻逼:').strip()
     if not choice.isdigit():
         print('傻逼,没有该命令,重新输')
         continue

     if choice == '0':
         break

     if choice in func_dic:
         func_dic[choice]()
     else:
         print('输入的指令不存在,傻逼')

递归

第n个员工的薪水,需要回溯得到(n-1)个员工的薪水,以此类推,直到得到第一个员工的薪水,此时,salary(1)已知,因而不必再向前回溯了。然后进入递推阶段:从第一个员工的薪水可以推算出第二个员工的薪水(6000),从第二个员工的薪水可以推算出第三个员工的薪水(7000),以此类推,一直推算出第第四个员工的薪水(8000)为止,递归结束。需要注意的一点是,递归一定要有一个结束条件,这里n=1就是结束条件
def salary(n):
    if n == 1:
        return 5000
    return salary(n - 1) + 1000


s = salary(4)
print(s)  # 8000

例2
l = [1, [2, [3, [4, [5, [6, [7, [8]]]]]]]]


def func(l):
    for item in l:
        if type(item) is list:
            func(item)
        else:
            print(item)


func(l)

递归实现二分法

nums = [3, 7, 9, 13, 21, 33, 57, 63, 78, 99]
find_num = 57


def search(nums, find_num):
    mid = len(nums) // 2

    if find_num > nums[mid]:
        search(nums[mid + 1:], find_num)
    elif find_num < nums[mid]:
        search(nums[:mid], find_num)

    else:
        print("find it")


search(nums, find_num)


九九乘法法表

row = 1
while row <=9:
    col =1
    while col <= row:
        print("%d * %d = %d" % (col,row,col*row),end ='\t')      
        #\t 字符串保持对齐  end= "" 不换行打印

        
        col += 1
    print("")  #上面的print函数完成后自动换行打印
    row += 1

变量参数求和

#方法1
def sum_2_sum(num1, num2):
    res = num1 + num2
    print("%d + %d = %d " % (num1, num2, res))


num_2_num(1, 2)
#方法2
def sum_2_sum(num1,num2)
     return num1+num2
res = sum_2_sum (10,20)
print res
#方法3  设定一个数,return到那个数 停止运行
def sum_numbers(num):

    if num == 1:
        return 1
    sum_numbers(num - 1)
    temp = sum_numbers(num - 1)
    return num + temp


res = sum_numbers(2)
print(res)

# #函数内部的代码是相同的,只是针对函数不同,处理的结果也不同
# # #当参数满足一个条件时,函数不再执行
#方法4
def sum_numbers(*args):
    num = 0
    print(args)
    # 循环遍历
    for n in args:
        num += n
    return num


result = sum_numbers(1, 2, 3, 4, 5)
print(result) 

#方法5
from functools import reduce

res = reduce(lambda x,y:x+y,[1,2,3,4,5],100)
print(res)
# 115

偶数求和

#正常求和
print(sum([1,99]))    #100



#方法一
res = 0

i = 0
while i <= 100:
    if i % 2 == 0:
        print(i)

        res += i
    i += 1
print("所有偶数和为 = %d" % res)


#方法2
res = 0
for i in range(0,101,2):
    res += i
print(res)

#方法3
l =[]
for i in range(1,101):
    if i%2 ==0:
        l.append(i)
 print(sum(l))
        
    
     

元组和字典的拆包

# 在调用多值参数的函数时,如果希望:
# 将一个元组变量直接传递给 args 将一个字典变量直接传递给 kwargs 就可以使用拆包

def demo(*args, **kwargs):
    print(args)
    print(kwargs)

将一个元组变量\字典变量传递给函数对应函数

gl_nums = (1, 2, 3)
gl_xiaoming = {"name": "小明", "age": 18}

demo(*gl_nums, **gl_xiaoming)

#(1, 2, 3)
#{'name': '小明', 'age': 18}#


石头剪刀布小游戏

import random

player = int(input("输入要出的拳 石头(1)/剪刀(2)/布(3):"))

computer = random.randint(1,3)

print("玩家选择的是%d - 电脑出的是 %d" %(player,computer))
while True:
    if ((player == 1 and computer ==2)
        or (player == 2 and computer ==3)
        or (player == 3 and computer ==4)):
        print("win")
        break
    else:
        print("lose")
        break

买苹果教程

#需求:收银员输入苹果的价格,单位 元/斤
#      收银员输入用户购买苹果的重量,单位:斤
#      计算价格并输出付款金额

# 1. 输入苹果的单价
price_str = input("苹果的单价:")
# 2. 输入苹果的重量
weight_str = input("苹果的重量:")

# 3. 输入总金额
# money = price_str * weight_str  主要字符串不能相乘 转换成浮点型

price = float(price_str)
weight = format(weight_str)

money = price * weight
print(money)


#加强
price = float(input("苹果的单价:"))
weight = float(input("苹果的重量:"))

money = price * weight
print(money)


类的使用

#在哪一个对象调用的方法,方法内的self就是哪一个对象的引用
#在类封装方法呢不,self表示当前调用方法的对象自己
#在方法内部。可以通过self访问对象的属性,也可以通过self调用其他的对象方法
class human:                #定义一个类:人类
    def love(self):
        print("%s 爱女人" % self.name)

    def hooby(self):
        print("还喜欢奶子")


tom = human()
tom.name = "建国"
tom.love()
tom.hooby()
print(tom)   #tom的内存地址



jerry = human()
jerry.name = "郭飞"
jerry.love()
jerry.hooby()
# print(jerry)

类的初始化方法加改进

# 使用类名()创建对象的时候,会自动调用厨是话方法
# 1.为对象在内存中分配空间--创建对象
# 2.为对象的属性设置一个初始值--初始化方法init
# _init_是对象的内置方法,用来定义一个类具有哪些属性的方法
# 在init方法内部使用self.属性名 = 属性的初始值就可以定义属性
# 定义属性后在使用cat类创建的对象,都会拥有这个属性
class Cat:
    def __init__(self):
        print("这是一个初始化方法")

        self.name = "建国"

    def eat(self):
        print("%s 爱吃肉" % self.name)


jianguo = Cat()  # 创建建国猫的对象
print(jianguo.name)
jianguo.eat()                          
#但是建国名字是固定死的
class Cat:
    def __init__(self,new_name):   #++++++  (.name)
        # print("这是一个初始化方法")

        self.name = "建国"
        self.name = new_name   #++++++++++++++++    
    def eat(self):
        print("%s 爱吃肉" % self.name)


jianguo = Cat("建国")  # 创建建国猫的对象
print(jianguo.name)
jianguo.eat()

guofei = Cat("郭飞")
print(guofei.name)
guofei.eat()

面对对象的封装案例

# 小明爱跑步
# ●存放家具
# 01.封装
# 1.封装是面向对象编程的一大特点
# 2.面向对象编程的第一步--将属性和方法封装到一个抽象的类
# 3.外界使用类创建对象,然后让对象调用方法
# 4.对象方法的细节都被封装在类的内部


# 02.小明爱跑步
# 需求
# 小明体重75.0公斤
# 2.小明每次跑步会减肥8.5公斤
# 3.小明每次吃东西体重增加1公斤

class person:
    def __init__(self, name, weight):
        # self.属性 = 形参
        self.name = name
        self.weight = weight

    def __str__(self):
        return "我的名字是%s 体重是 %.2f公斤" % (self.name, self.weight)  # .2f表示在输出后保留两位小数

    def run(self):
        print("%s爱跑步,跑步锻炼身体" % self.name)
        self.weight -= 0.5

    def eat(self):
        print("%s是吃货,吃完这顿在减肥" % self.name)
        self.weight += 1


xiaoming = person("小明", 75.0)

xiaoming.run()
xiaoming.eat()

print(xiaoming)

xiaomei = person("小美",45)
xiaomei.eat()
xiaomei.run()
print(xiaomei)

# 小明爱跑步,跑步锻炼身体
# 小明是吃货,吃完这顿在减肥
# 我的名字是小明 体重是 75.50公斤
# 小美是吃货,吃完这顿在减肥
# 小美爱跑步,跑步锻炼身体
# 我的名字是小美 体重是 45.50公斤

类的案例:摆放家具*****

# 需求
# 1.房子( House)有户型、总面积和家具名称列表
# ·新房子没有任何的家具
# 2.家具(HouseItem)有  名字  和   占地面积
# 其中
# ·席梦思(bed)占地40平米
# ·衣柜(chest)占地5平米
# ·餐桌(table)占地3平米
# 3.将以上三件家具添加到房子中
# 4.打印房子时,要求输出:户型、总面积、剩余面积、家具名称列表

# 剩余面积
# 在创建房子对象时,定义一个剩余面积的属性,初始值和总面积相当
# 当调用add_item方法,向房间添加家具时,让剩余面积 -= 家具面积

class HouseItem:

    def __init__(self,name,area):
        self.name = name
        self.area = area
    def __str__(self):
        return "[%s]占地 %.2f" %(self.name,self.area)


class House:
        def __init__(self,house_type,area):
            self.house_type = house_type
            self.area = area
            # 剩余面积
            self.free_area = area
            # 家具名称列表
            self.item_list =[]
        def __str__(self):
            # Python 能够自动的讲一堆括号内部的代码链接在一起
            return ("户型:%s\n总面积:%.2f[剩余:%.2f]\n家具:%s"
                    % (self.house_type,self.area,
                       self.free_area,self.item_list))

        # 添加家具的需求: 1.判断家具面积是否超过剩余面积,如果超过,提示不能添加这件家具
        # 2.将家具的名称追加到家具名称列表中
        # 3.用房子总面积-家具面积=剩余面积
        def add_item(self,item):
            print("要添加 %s" % item)
            #1.判断家具的面积
            if item.area > self.free_area:
                print("%s的面积太大了,无法添加" % item.name)
                return
            #2.家具添加列表
            self.item_list.append(item.name)

            #3.计算剩余面积
            self.free_area -= item.area





# 1.创建家具
bed = HouseItem("席梦思",40)
chest = HouseItem("衣柜",5)
table = HouseItem("桌子",3)

print(bed)
print(chest)
print(table)

# 2.创建房子对象
my_home = House("两室一厅",60)
my_home.add_item(bed)
my_home.add_item(chest)
my_home.add_item(table)

print(my_home)

# 小结:
# 1.创建一个房子类,使用——init——,——str——两个内置方法
# 2.准备了一个 add_item方法准备添加家具
# 3.使用房子类创建一个房子对象 4.让房子对象调用了3次add_item方法,将三件家具以实参传递到 add_item内部


内置模块pi 计算圆的周长和面积

from math import pi


def cicle(radius, mode=0):
    def perimiter(radius):
        return 2 * pi * radius

    def area(radius):
        return pi * (radius ** 2)

    if mode == 0:
        return perimiter(radius)
    elif mode == 1:
        return area(radius)


res = cicle(5, 0)
print(res)

函数传参

#方案一 
def wrapper(x):
    print(x)
wrapper(1111)
wrapper(2222)
#方案二:闭包函数
def outter():
    x = 111

    def wrapper():
        print(x)
    return wrapper


f = outter()
f()

           

装饰器不修改参数加功能

优化1

import time   # 调用time

def index(x,y,z):
    time.sleep(5)
    print("index %s %s %s" % (x,y,z))

def wrapper(*args,**kwargs):   #加* **是把index写活  解决函数冗余问题
    start = time.time()
    index(*args,**kwargs)
    stop = time.time()
    print(stop - start)

wrapper(1111,2222,333)


优化2

import time


def index(x, y, z):
    time.sleep(5)
    print("index %s %s %s" % (x, y, z))


def outter(func):
    # index的内存地址
    def wrapper(*args, **kwargs):
        start = time.time()
        func(*args, **kwargs)  # index(333,4444,5555)
        stop = time.time()
        print(stop - start

    return wrapper


index = outter(index)  # f = outter(index的内存地址)
index(111, 222, 333)
              
#方案三

import time


def index(x):
    time.sleep(5)
    print("index %s " % (x))
    

def outter(func):
    # index的内存地址
    def wrapper(*args, **kwargs):
        start = time.time()
        res = func(*args, **kwargs)  
        stop = time.time()
        print(stop - start)
        return res

    return wrapper

index = outter(index)  # index = outter(index的内存地址)
# index(111)
res = index(666)
print(res)

#index 666 
#5.005807638168335
#7777

              
          

装饰器模板

# 无参装饰器
import time

def timmer(func):
    def wrapper(*args, **kwargs):
        # 加需要添加的功能(时间)
        #start = time.time()
        #time.sleep(2)
        res = func(*args, **kwargs)
        #stop = time.time()
        #print(stop - start)
        return res

    return wrapper


@timmer
def index():
    print("from index")


index()
# 有参装饰器
def outter(x):
    def foo(func):
        def wrapper(*args, **kwargs):
            #添加功能
            res = func(*args, **kwargs)
            return res
        return wrapper
    return foo

二层装饰器认证功能

account ={"is_authenticatied" :False,  #用户登录了就把这个改成TRUE
          "username" :"louyazhou", #存进去的用户信息
          "password":"123"

}

def login(func):
    def wrraper(*args,**kwargs):
        if account["is_authenticated"] is False:
            username = input("user:")
            password = input("password:")
            if username == account["username"] and password == account["password"]:
                print("welcome login")
                account["is_authenticated"] = True
                func(*args,**kwargs)#认证成功 执行代码
            else:
                print("err")
        else:
            print("successful")
    return wrraper


def home():
    print("————首页————")

@login
def america(vip):
    if vip > 3:
        print("解锁VIP高级玩法")
    else:

        print("—————欧美专区—————")
@login
def japan(vip):
    if vip > 4:
        print("解锁日韩全片资源")
    else:
        print("——————日韩专区——————")
home()
america(4)
japan(5)


#————首页————
user:louyazhou
password:123
welcome login
解锁VIP高级玩法
successful

posted @ 2021-07-05 21:30  Aisa  阅读(48)  评论(0)    收藏  举报