黑马python入门笔记(部分)

综合应用—名片管理系统

  • 框架搭建
  1. 新建main.py文件保存主程序代码:程序入口
  2. 新建tools.py文件所以功能函数:对名片的增删改查
TODO注释:用于标记需要去做的工作
# TODO(名字) 显示功能菜单
import card_toos
while True:
    # TODO 显示功能菜单
    card_toos.show_menu()
    action_str=input("请选择操作:")
    print("您选择的操作是【%s】" % action_str)
    # 1,2,3针对名片操作
    # 0退出程序
    # 其他输入错误
    if action_str in ["1", "2", "3"]:
        if action_str ==1:
            card_toos.new_card()
        elif action_str == 2:
            card_toos.show_all()
        elif action_str ==3:
            card_toos.search_card()
        
    # 如果在开发时不希望编写分支内部,可以使用pass关键字,保证代码正确
    elif action_str == 0:
        print("欢迎再次使用")
        break
        # pass

    else:
        print("您输入错误,请重新选择")

def show_menu():
    print("*" * 50)
    print("欢迎使用【名片管理系统】 v 1.0")
    print("")
    print("1.新增名片")
    print("2.显示全部")
    print("3.搜索名片")
    print("")
    print("0.退出系统")
    print("*" * 50)
def new_card():
    """新增名片"""
    print("-"*50)
    print("新增名片")
def show_all():
    """显示全部"""
    print("-" * 50)
    print("显示全部")
def search_card():
    """搜索名片"""
    print("-" * 50)
    print("搜索名片")
  • 保存名片的数据结构
  1. 使用字典记录每一张名片的详细信息
  2. 使用列表统一记录所有的名片字典
  3. 在tools文件顶部增加一个列表变量
  • 新增名片
  1. pycharm技巧:统一修改变量名,鼠标右键选中refactor,rename,all
def new_card():
    """新增名片"""
    print("-"*50)
    print("新增名片")
    name = input("请输入名字:")
    phone = input("请输入电话:")
    qq = input("请输入qq:")
    email = input("请输入邮箱:")
    #1.提示用户输入名片详细信息
    card_dict = {"name": name,
                 "phone": phone,
                 "qq": qq,
                 "email": email}
    #2.建立字典
    card_list.append(card_dict)
    print(card_list)
    #3.将名片字典添加到列表中
    print("添加%s的名片成功" % name)
    #4.提示用户成功
  • 显示全部
def show_all():
"""显示全部"""
print("-" * 50)
    print("显示全部")
    #判断是否存在名片记录
    if len(card_list) == 0:
        print("当前没有名片记录,请添加名片")
        #可以返回一个函数的执行结果,下方代码不会执行,return后无内容返回调用函数位置
        return
    #打印表头
    for name in ["姓名", "电话", "QQ", "邮箱"]:
        print(name, end="\\t\\t")
    #打印分割线
    print("=" * 50)
    #遍历名片列表,依次输出字典信息
    for card_dict in card_list:
        print("%s\\t\\t%s\\t\\t%s\\t\\t%s" % (card_dict["name"],
                                        card_dict["phone"],
                                        card_dict["qq"],
                                        card_dict["email"]))

  • 查询名片
def search_card():
    """搜索名片"""
    print("-" * 50)
    print("搜索名片")
    #1.提示用户要搜索的姓名
    find_name = input("请输入要搜索的姓名:")
    #2.遍历名片列表,查询名字,如未找到,提示用户
    for card_dict in card_list:
        if card_dict["name"] == find_name:
            print("姓名\\t\\t电话\\t\\tQQ\\t\\t邮箱")
            print("="*50)
            print("%s\\t\\t%s\\t\\t%s\\t\\t%s" % (card_dict["name"],
                                            card_dict["phone"],
                                            card_dict["qq"],
                                            card_dict["email"]))
            break
        else:
            print("抱歉,没有找到%s" % find_name)
  1. 删除操作,修改操作
def deal_card(find_dict):
    print(find_dict)
    action_str = input("请选择操作 1 修改,2 删除,0 返回上级菜单")
    if action_str == "1":
        find_dict["name"] = input_card(find_dict["name"], "姓名:[回车不修改]")
        find_dict["phone"] = input_card(find_dict["phone"], "电话:[回车不修改]")
        find_dict["qq"] = input_card(find_dict["qq"], "QQ:[回车不修改]")
        find_dict["email"] = input_card(find_dict["email"], "邮箱:[回车不修改]")
        print("修改成功")
    elif action_str == "2":
        card_list.remove(find_dict)
        print("删除成功")

def input_card(dict_value, tip_message):
    #1. 提示用户输入内容
    result = input(tip_message)
    #2. 对输入判断,若输入内容,返回结果
    if len(result) > 0:
        return result
    else:
        return dict_value
    #3. 若不输入内容,返回原值
  • 全部代码
import card_toos
while True:
    # TODO 显示功能菜单
    card_toos.show_menu()
    action_str=input("请选择操作:")
    print("您选择的操作是【%s】" % action_str)
    # 1,2,3针对名片操作
    # 0退出程序
    # 其他输入错误
    if action_str in ["1", "2", "3"]:
        if action_str ==1:
            card_toos.new_card()
        elif action_str == 2:
            card_toos.show_all()
        elif action_str ==3:
            card_toos.search_card()

    # 如果在开发时不希望编写分支内部,可以使用pass关键字,保证代码正确
    elif action_str == 0:
        print("欢迎再次使用")
        break
        # pass

    else:
        print("您输入错误,请重新选择")
#记录名片记录的列表
card_list = []

def show_menu():
    print("*" * 50)
    print("欢迎使用【名片管理系统】 v 1.0")
    print("")
    print("1.新增名片")
    print("2.显示全部")
    print("3.搜索名片")
    print("")
    print("0.退出系统")
    print("*" * 50)
def new_card():
    """新增名片"""
    print("-"*50)
    print("新增名片")
    name = input("请输入名字:")
    phone = input("请输入电话:")
    qq = input("请输入qq:")
    email = input("请输入邮箱:")
    #1.提示用户输入名片详细信息
    card_dict = {"name": name,
                 "phone": phone,
                 "qq": qq,
                 "email": email}
    #2.建立字典
    card_list.append(card_dict)
    print(card_list)
    #3.将名片字典添加到列表中
    print("添加%s的名片成功" % name)
    #4.提示用户成功
def show_all():
    """显示全部"""
    print("-" * 50)
    print("显示全部")
    #判断是否存在名片记录
    if len(card_list) == 0:
        print("当前没有名片记录,请添加名片")
        #可以返回一个函数的执行结果,下方代码不会执行,return后无内容返回调用函数位置
        return
    #打印表头
    for name in ["姓名", "电话", "QQ", "邮箱"]:
        print(name, end="\\t\\t")
    #打印分割线
    print("=" * 50)
    #遍历名片列表,依次输出字典信息
    for card_dict in card_list:
        print("%s\\t\\t%s\\t\\t%s\\t\\t%s" % (card_dict["name"],
                                        card_dict["phone"],
                                        card_dict["qq"],
                                        card_dict["email"]))

def search_card():
    """搜索名片"""
    print("-" * 50)
    print("搜索名片")
    #1.提示用户要搜索的姓名
    find_name = input("请输入要搜索的姓名:")
    #2.遍历名片列表,查询名字,如未找到,提示用户
    for card_dict in card_list:
        if card_dict["name"] == find_name:
            print("姓名\\t\\t电话\\t\\tQQ\\t\\t邮箱")
            print("="*50)
            print("%s\\t\\t%s\\t\\t%s\\t\\t%s" % (card_dict["name"],
                                            card_dict["phone"],
                                            card_dict["qq"],
                                            card_dict["email"]))
            deal_card(card_dict)
            break
        else:
            print("抱歉,没有找到%s" % find_name)

def deal_card(find_dict):
    print(find_dict)
    action_str = input("请选择操作 1 修改,2 删除,0 返回上级菜单")
    if action_str == "1":
        find_dict["name"] = input_card(find_dict["name"], "姓名:[回车不修改]")
        find_dict["phone"] = input_card(find_dict["phone"], "电话:[回车不修改]")
        find_dict["qq"] = input_card(find_dict["qq"], "QQ:[回车不修改]")
        find_dict["email"] = input_card(find_dict["email"], "邮箱:[回车不修改]")
        print("修改成功")
    elif action_str == "2":
        card_list.remove(find_dict)
        print("删除成功")

def input_card(dict_value, tip_message):
    #1. 提示用户输入内容
    result = input(tip_message)
    #2. 对输入判断,若输入内容,返回结果
    if len(result) > 0:
        return result
    else:
        return dict_value
    #3. 若不输入内容,返回原值

变量引用

  • 变量和数据保存在内存
  • 函数的参数传递和返回值靠引用传递

1. 引用概念:变量中记录数据地址,叫引用

2. 变量引用示例

>>> a = 1
>>> id(a)
2692085776624
>>> b = a
>>> id(b)
2692085776624
>>> a = 2
>>> id(a)
2692085776656
>>> id(b)
2692085776624

3. 函数的参数和返回值:实参/返回值靠引用传递

def test(num):
    print("函数内部%d对应的地址%d" % (num, id(num)))
a = 10
id(a)
test(a)
#两个值相同

可变类型和不可变类型

  • 不可变类型:数字类型:int,bool,complex,long(2,x)

    字符串:str

    元组:tuple

  • 可变类型:数据能被修改

    列表:list

    字典:dict key只能使用不可变数据类型

局部变量和全局变量

  • 局部变量是在函数内部定义的变量,只能在函数内部使用
  • 全局变量是函数外定义的变量,所以函数内部都可以使用
  • 局部变量在函数被调用时才被创建,执行结束后被回收
  • 函数内部可以通过全局变量的引用获取全局变量,但是不允许直接修改全局变量的引用———使用赋值语句修改全局变量的值
  • 在函数内部修改全局变量:global num
  • 全局变量命名应增加g_/gl_前缀

函数的返回值

  • 利用元组返回多个结果
def measure():
    temp =39
    wetness = 50
	    return (temp,wetness)#小括号可省略
result = measure()
print(result)
print(result[0])#单独处理
gl_temp,gl_wet = result#使用多个变量一次接收,变量数与元素个数一致

交换两个变量值

  • 使用临时变量:c = b

b = a

a = c

  • 不使用临时变量:a = a+b

b = a - b

a = a - b

  • 利用元组

a,b = (b,a)

函数参数进阶

  • 函数内部对参数赋值不会影响外部实参
  • 参数为可变类型参数,在函数内部使用方法会影响外部实参
  • +=本质上是调用extend方法#针对列表变量
  • 缺省参数,定义函数时指定默认值
  • 缺省参数注意事项
  1. 确保带有默认值的缺省参数在参数列表末尾

多值参数

  • 一个函数可以处理的参数个数不确定

  • 有两种多值参数

    • 参数名前加*,接受元组(习惯使用*args)
    • 参数名前加两个*,接受字典(习惯使用**kwargs)
    def demo(num,*nums,**person):
        print(num)
        print(nums)
        print(person)
    demo(1,2,3,4,5,name = "xiaoming",age = 18)
    
    1
    (2, 3, 4, 5)
    {'name': 'xiaoming', 'age': 18}
    

递归

特点

  • 函数内部自己调用自己
  • 可以调用其他函数,也可以调用本身
  • 需要一个出口结束递归

递归案例—数字累加

def sum(num):
    if num == 1:
        return 1
    temp = sum(num - 1)
    return temp+num
result = sum(100)
print(result)

5050

面向对象的概念

面向过程

  • 把某一个需求从头到尾一一实现
  • 将功能独立的代码封装
  • 最后完成的代码就是顺序调用不同函数

面写对象

  • 确定职责—要做的事情、方法
  • 根据职责来确定不同对象,对象内部封装多个方法
  • 让不同对象调用不同方法

  • 类名:驼峰命名法:CapWords
  1. 每个单词首字母大写
  2. 单词与单词间没有下划线
  • 属性和方法

定义简单的类(只含方法)

class 类名 :
    def 方法( self,参数列表):
     pass

对象变量 = 类名()

class Cat:
    def eat(self):
        print("小猫爱吃鱼")
tom = Cat()
tom.eat()
print(tom)
ltom = Cat()
print(ltom)
tom.name = "Tom"    #添加属性(不推荐)

小猫爱吃鱼
<__main__.Cat object at 0x0000028C3A5B37C0>
<__main__.Cat object at 0x0000028C3A5B3790>
class Cat:
    def eat(self):
        print("%s爱吃鱼" % self.name)
tom = Cat()
tom.name = "Tom"#添加属性
tom.eat()
print(tom)
ltom = Cat()
print(ltom)

Tom爱吃鱼
<__main__.Cat object at 0x0000018C54A77B80>
<__main__.Cat object at 0x0000018C54F03820>
class Cat:
    def __init__(self):   #在创建对象时会自动调用该方法
        print("这是一个初始化方法")
    def eat(self):
        print("%s爱吃鱼" % self.name)
tom = Cat()
tom.name = "Tom"#添加属性
tom.eat()
print(tom)
ltom = Cat()
print(ltom)

这是一个初始化方法
Tom爱吃鱼
<__main__.Cat object at 0x000001FEDC403FA0>
这是一个初始化方法
<__main__.Cat object at 0x000001FEDC403E80>
  • 在初始化方法中定义属性
class Cat:
    def __init__(self):
        print("这是一个初始化方法")
        self.name = "tom"
    def eat(self):
        print("%s爱吃鱼" % self.name)
tom = Cat()
print(tom.name)

这是一个初始化方法
tom
class Cat:
    def __init__(self, new_name):  #使用参数初始化参数
        print("这是一个初始化方法")
        self.name = new_name
    def eat(self):
        print("%s爱吃鱼" % self.name)
tom = Cat("大懒猫")
print(tom.name)

  • ——del——方法:在对象被销毁前使用del方法,一旦调用则结束生命周期
class Cat:
    def __init__(self, new_name):
        self.name = new_name
        print("%s来了" % self.name)

    def __del__(self):
        print("我去了")
    def eat(self):
        print("%s爱吃鱼" % self.name)
tom = Cat("大懒猫")
print("*" * 50)

#所以代码执行完成才会自动清除全局变量,及tom变量

大懒猫来了
**************************************************
我去了

  • ——str——方法:希望使用print输出对象变量时能够打印自定义内容,可以利用str内置方法。必须返回字符串
class Cat:
    def __init__(self, new_name):
        self.name = new_name
        print("%s来了" % self.name)

    def __del__(self):
        print("我去了")
    def eat(self):
        print("%s爱吃鱼" % self.name)
    def __str__(self):
        return "我是小猫"
tom = Cat("大懒猫")
print(tom)

你可能感兴趣的:(python,pycharm,开发语言)