黑马程序员技术交流社区
标题:
python技术贴
[打印本页]
作者:
Nicepp
时间:
2018-8-2 00:10
标题:
python技术贴
变量类型的转换——买苹果问题升级版
# 定义苹果的单价
price =
float
(
input
(
"请输入苹果的单价:"
))
# 定义苹果的重量
weight =
float
(
input
(
"请输入苹果的重量:"
))
# 计算苹果的价格
money = price * weight -
20
print
(money)信息录入——input函数name =
input
(
"姓名:"
)
gender =
input
(
"性别:"
)
age =
input
(
"年龄:"
)
company =
input
(
"单位:"
)
number =
input
(
"联系方式:"
)判断——if语句
number
=
int
(
input
(
"请输入数字1-7:"
))
if
1
<=
number
<=
7
:
if
number
==
6
or
number
==
7
:
print
(
"周末"
)
else
:
print
(
"工作日"
)
else
:
print
(
"输入错误"
)
格式化输出
price
=
7.899
weight =
3.688
money =
price
* weight
print
(
"苹果的单价 %.2f, 购买了 %.2f, 总价为 %.2f"
% (
price
,
weight
,
money))逻辑运算符
# - 要求只要有一门成绩 > 60 分就算合格
# 3. 练习3: 定义一个布尔型变量 is_employee,编写代码判断是否是本公司员工
# - 如果不是提示不允许入内
age =
18
if
0
<= age <=
120
:
print
(
"年龄正确"
)
else
:
print
(
"年龄不正确"
)
python_score =
50
c_score =
70
if
python_score >
60
or
c_score >
60
:
print
(
"合格"
)
else
:
print
(
"不合格"
)
is_employee =
True
if not
is_employee: # bool型
print
(
"非本公司职员不得入内"
)
else
:
print
(
"欢迎"
)
剪刀石头布综合案例
import
random
# 1. 从控制台输入要出的拳 —— 石头(1)/剪刀(2)/布(3)
player =
int
(
input
(
"石头(1)/剪刀(2)/布(3)输入的是:"
))
# 2. 电脑 随机 出拳 —— 先假定电脑只会出石头,完成整体代码功能
computer = random.randint(
1
,
3
)
# 3. 比较胜负
if
((player ==
1
and
computer ==
2
)
or
(player ==
2
and
computer ==
3
)
or
(player ==
3
and
computer ==
1
)):
print
(
"恭喜你,你赢了"
)
elif
player == computer:
print
(
"平局"
)
else
:
print
(
"你输了,真可惜"
)
打印小星星
# # 打印五行小星星
# row = 1
# while row <= 5:
# print("*" * row)
# row += 1
# 如果不希望末尾增加换行,可以在 print 函数输出内容的后面增加 , end=""
# print("*", end="")
# print("*")
row =
1
while
row <=
5
:
# 假设 python 没有提供字符串 * 操作
# 在循环内部,再增加一个循环,实现每一行的 星星 打印
col =
1
while
col <= row:
print
(
"*"
,
end
=
""
)
col +=
1
# 每一行星号输出完成后,再增加一个换行
print
(
""
)
row +=
1
九九乘法表
row
=
1
while
row
<=
9
:
col =
1
while
col <=
row
:
print
(
"%d * %d = %d"
% (
row
,
col
,
col*
row
)
,
end
=
"
\t
"
)
col +=
1
# print("%d" % row)
print
(
""
)
row
+=
1
函数返回值
"""定义函数"""
def
sum_all
(num1
,
num2):
# 两数相加
result = num1 + num2
# 返回值
return
result
# 在调用函数的地方新建变量接受返回值
sum_result = sum_all(
1
,
10
)
print
(
"%d"
% sum_result)
高级变量类型——列表的增删改查
name_list
= [
"zhangsan"
,
"lisi"
,
"wangwu"
]
# 增
name_list.insert(3, "小李") # 增加指定位置的数据
name_list.append("小平") # 末位增加数据
name_list.extend(["小李", "小平"]) # 末位增加列表数据
# 减
name_list.remove("zhangsan") # 从前往后删除指定一个数据
name_list.pop() # 先进后出,从末尾开始删除数据
name_list.pop(0) # 指定位置删除数据
name_list.clear() # 清空
# 查
print(name_list.index("zhangsan")) # 查数据的索引(位置)
print(name_list[0]) # 查索引所在位置的值
# 改
name_list[1] = "李四" # 修改指定位置的数据
# 统计
print(len(name_list)) # 统计列表数据长度
print(name_list.count("wangwu")) # 统计数据出现的次数
# 排序
name_list.sort() # 升序
name_list.sort(reverse=True) # 降序
name_list.reverse() # 反转排序
print
(
name_list
)
遍历——while和for
"""顺序的从列表中依次获取数据,每一次循环过程中,数据都会保存在
my_name 这个变量中,在循环体北部可以访问到当前这一次获取到的数据
"""
name_list = [
"zhangsan"
,
"lisi"
,
"wangwu"
]
for
my_name
in
name_list:
print
(
"我的名字是:%s"
% my_name)
"""
while 循环
"""
l =
len
(name_list)
i =
0
while
i < l:
print
(name_list
)
i +=
1
元组——增删改查
info_tuple
= (
"zhangsan"
,
18
,
1.75
)
print(type(info_tuple))
print(info_tuple[0])
empty_tuple = () # 定义一个空元组
print(type(empty_tuple))
single_tuple = (1,) # 定义只含有一个元素的元组,单个元素后需要加一个逗号
print(type(single_tuple))
# 取值和取索引
print(info_tuple[0])
print(info_tuple.index("zhangsan"))
# 统计计数
print(info_tuple.count("zhangsan"))
# 统计元组的长度
print(len(info_tuple))
列表和元组的转换
name_list
= [
"zhangsan "
]
print
(
tuple
(
name_list
))
info_tuple = (
"zhangsan"
,
)
print
(
list
(info_tuple))
字典
# 定义一个字典 注意:建与值之间用冒号分开,键值对之间用逗号分开
xiaoming = {
"name"
:
"小明"
,
"gender"
:
True
,
"height"
:
1.78
,
"weight"
:
77.50
}
# 取值
print(xiaoming["name"]) # 取值都是[]
# 增加/修改
xiaoming["age"] = 18 # 输入已存在的key就是修改
xiaoming["name"] = "小姚" # 输入不存在的key就是添加
# 删除
xiaoming.pop("name")
print(xiaoming)
# 统计字典键值对的数量
print(len(xiaoming))
# 合并字典
xiaoyao = {"age": 15}
xiaoming.update(xiaoyao) # 无返回值需重新再输出
print(xiaoming)
# 字典清空
print
(xiaoming.clear())
字典的遍历
xiaoming
= {
"name"
:
"xiaoming"
,
"age"
:
"15"
}
# 变量k是每一次循环中,获取到的键值对的key
for
k
in
xiaoming
:
print
(
"%s - %s"
% (k
,
xiaoming
[k]))
字符串的方法str1 =
"hello hello"
print(len(str1))
print(str1.count("ll"))
print(str1.count("abc"))
print(str1.index("h"))
print(str1[0])
# 识别字符串中是否含有数字
str1 = "一千零一"
print(str1.isdecimal())
print(str1.isdigit())
print(str1.isnumeric())
# replace 替换并不更改原来的字符串,只是新建了一个字符串
str1 = "hello world"
print(str1.replace("world", "python"))
print(str1)
拆分拼接
poem_str
=
"登黄鹤楼
\t
王之涣
\t
白日依山尽
\t\n
"
print
(
poem_str
)
# 拆分字符串
poem_list =
poem_str
.split()
# 有返还值需要新建一个变量接受
print
(poem_list)
# 拼接字符串
result =
" "
.join(poem_list)
# 有返还值需要新建一个变量接
print
(result)
切片
"""- 1. 截取从 2 ~ 5 位置 的字符串
- 1. 截取从 2 ~ 末尾 的字符串
- 1. 截取从 开始 ~ 5 位置 的字符串
- 1. 截取完整的字符串
- 1. 从开始位置,每隔一个字符截取字符串
- 1. 从索引 1 开始,每隔一个取一个
- 1. 截取从 2 ~ 末尾 - 1 的字符串
- 1. 截取字符串末尾两个字符
- 1. 字符串的逆序(面试题)
"""
num_str =
"0123456789"
print
(num_str[
2
:
6
])
# 截取从 2 ~ 5 位置 的字符串
print
(num_str[
2
:])
# 截取从 2 ~ 末尾 的字符串
print
(num_str[:
6
])
# 截取从 开始 ~ 5 位置 的字符串
print
(num_str[:])
# 截取完整的字符串
print
(num_str[::
2
])
# 从开始位置,每隔一个字符截取字符串
print
(num_str[
1
::
2
])
# 从索引 1 开始,每隔一个取一个
print
(num_str[
2
:-
1
])
# 截取从 2 ~ 末尾 - 1 的字符串
print
(num_str[-
2
:])
# 截取字符串末尾两个字符
print
(num_str[::-
1
])
# 字符串的逆序(面试题)
函数的返回值问题
def
measure
():
"""测量温度和湿度"""
print
(
"测量开始"
)
temp =
39
wetness =
50
print
(
"测量结束"
)
# 元组——可以包含多个数据,因此可以使用元组让函数一次返回多个值
# 如果返回的是元组小括号可以省略 return (temp, wetness)
return
temp
,
wetness
result = measure()
print
(result)
# 如果函数返回的类型是元组,同时希望单独的处理元组中的元素
# 可以使用多个变量,一次接受函数的返回结果
# 注意:使用多个变量接收结果时,变量的个数应该和元组中元素的个数相同
gl_temp
,
gl_wetness = measure()
print
(gl_temp)
print
(gl_wetness)
可变量与不可变量
# 在 python 中,列表变量调用 += 本质上是在执行列表变量的 extend 方法,不会修改变量的引用
def
demo
(num
,
num_list):
print
(
"函数开始"
)
num += num
# num_list = num_list + num_list与num_list += num_list不同
# num_list += num_list本质上是extend方法:num_list.extend
num_list += num_list
print
(num)
print
(num_list)
print
(
"函数完成"
)
gl_num =
9
gl_list = [
1
,
2
,
3
]
demo(gl_num
,
gl_list)
print
(gl_num)
print
(gl_list)
缺省参数gl_list = [
6
,
3
,
9
]
#
# # 默认按照升序排序
# # gl_list.sort()
#
# # 如果升序需要引入reverse
# gl_list.sort(reverse=True)
# #
# print(gl_list)
gl_list.reverse()
print
(gl_list)
def
print_info
(name
,
gender=
True
):
"""
:param
name: 姓名
:param
gender: True 男生 False女生
"""
gender_text =
"男生"
if not
gender:
gender_text =
"女生"
print
(
"%s 是 %s"
% (name
,
gender_text))
# 提示在指定缺省参数时应该使用最常见的值
print_info(
"xiaoming"
)
print_info(
"xiaomei"
,
False
)
def
gender_info
(name
,
title=
""
,
gender=
True
):
"""
:param
name: 姓名
:param
title: 职位
:param
gender: True 男生 False 女生
:return
:
"""
gender_text =
"男生"
if not
gender:
gender_text =
"女生"
print
(
"[%s] %s 是 %s"
% (title
,
name
,
gender_text))
gender_info(
"xiaoming"
,
gender
=
False
)
gender_info(
"xiaomei"
)
多值参数
def
demo
(num
,
*nums
,
**person):
print
(num)
print
(nums)
print
(person)
demo(
1
)
demo(
1
,
2
,
3
,
4
,
name
=
"xiaoming"
,
age
=
18
)
# 多值参数应用求多个整数和
def
sum_all
(*num):
sum =
0
for
n
in
num:
sum += n
return
sum
result = sum_all(
1
,
3
,
9
)
print
(result)
拆包
def
demo
(*args
,
**kwargs):
print
(args)
print
(kwargs)
gl_nums = (
1
,
2
,
3
)
gl_dict = {
"name"
:
"小明"
,
"age"
:
18
}
# 拆包:在元组变量前加* 在字典变量前加**
demo(*gl_nums
,
**gl_dict)
demo(
1
,
2
,
3
,
name
=
"小明"
,
age
=
18
)
递归
# def sum_number(num):
# print(num)
# # 递归的出口,当参数满足条件时不再执行函数
# if num == 1:
# return
# # 自己调用自己就是递归
# sum_number(num-1)
# print(num)
# sum_number(3)
def
sum_numbers
(num):
# 1.出口
if
num ==
1
:
return
1
# 数字的累加num+(1.。。。。num-1)
# 假设sum_numbers 能够正确处理1.。。num-1
temp = sum_numbers(num-
1
)
# 两个数字相加(当前的num+tmp)
return
num + temp
result = sum_numbers(
100
)
print
(result)
烤地瓜问题
# 定义一个地瓜类
class
Sweetpotato
:
# 设置默认值
def
__init__
(
self
):
self
.cookedlevel =
0
self
.cookedstring =
"生的"
self
.condiments = []
# 设置烤地瓜方法
def
cook
(
self
,
time):
self
.cookedlevel += time
if
self
.cookedlevel >
8
:
self
.cookedstring =
"烤焦了"
elif
self
.cookedlevel >
5
:
self
.cookedstring =
"烤好了"
elif
self
.cookedlevel >
3
:
self
.cookedstring =
"半生不熟"
else
:
self
.cookedstring =
"生的"
def
__str__
(
self
):
return
""
my_sweetpotato = Sweetpotato()
print
(my_sweetpotato.condiments)
print
(my_sweetpotato.cookedstring)
print
(my_sweetpotato.cookedlevel)
面向对象——私有问题和私有方法
class
Women
:
def
__init__
(
self
,
name):
self
.name = name
self
.__age =
18
def
__secret
(
self
):
print
(
"%s的年龄是%d"
% (
self
.name
,
self
.__age))
xiaomei = Women(
"小美"
)
print
(xiaomei._Women__age)
# 在名称前面加上 _类名 => _类名__名称(伪私有属性和私有方法)
xiaomei._Women__secret()
# print(xiaofang.__age) 不能直接调用
# xiaofang.__secret()
继承
class
Animal
:
def
eat
(
self
):
print
(
"吃"
)
def
drink
(
self
):
print
(
"喝"
)
class
XiaoTianQuan
(Animal):
def
fly
(
self
):
print
(
"飞"
)
xiaotianquan = XiaoTianQuan()
xiaotianquan.fly()
xiaotianquan.eat()
xiaotianquan.drink()
多态
class
Dog
(
object
):
def
__init__
(
self
,
name):
self
.name = name
def
game
(
self
):
print
(
"%s玩耍"
%
self
.name)
class
Xiaotianquan
(Dog):
def
game
(
self
):
print
(
"%s飞到天上去"
%
self
.name)
class
Person
(
object
):
def
__init__
(
self
,
name):
self
.name = name
def
game_with_dog
(
self
,
dog):
print
(
"%s和%s快乐的玩耍"
% (
self
.name
,
dog.name))
# 让狗玩耍
dog.game()
# 创建一个狗对象
# wangcai = Dog("旺财")
wangcai = Xiaotianquan(
"飞天旺财"
)
# 创建一个小明对象
xiaoming = Person(
"小明"
)
# 让小明调用和狗玩
xiaoming.game_with_dog(wangcai)
捕获未知错误类型
try
:
num =
int
(
input
(
"请输入一个整数:"
))
result =
8
/ num
print
(result)
except
ValueError
:
print
(
"请输入正确的数字"
)
except
ZeroDivisionError
:
print
(
"除0错误"
)
except
Exception
as
result:
print
(
"未知错误 %s"
% result)
else
:
print
(
"没有错误才能执行"
)
finally
:
print
(
"无论正确与否都能执行"
)
摆放家具模型
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
,
type
,
area):
self
.type = type
self
.area = area
# 剩余面积
self
.free_area = area
# 家具名称列表
self
.item_list = []
def
__str__
(
self
):
return
(
"户型:%s
\n
总面积:%.2f[剩余:%.2f]
\n
家具:%s"
%
(
self
.type
,
self
.area
,
self
.free_area
,
self
.item_list))
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(
"席梦思"
,
4
)
chest = HouseItem(
"衣柜"
,
2
)
table = HouseItem(
"餐桌"
,
1.5
)
print
(bed)
print
(chest)
print
(table)
# 2. 创建房子对象
my_house = House(
"两室一厅"
,
60
)
my_house.add_item(bed)
my_house.add_item(chest)
my_house.add_item(table)
print
(my_house)
士兵突击问题
class
Gun
:
def
__init__
(
self
,
model):
# 枪的型号
self
.model = model
# 子弹数量
self
.
bullet_count
=
0
def
add_bullet
(
self
,
count):
self
.
bullet_count
+= count
def
shoot
(
self
):
# 1.判断子弹数量
if
self
.
bullet_count
<=
0
:
print
(
"[%s]没有子弹了"
%
self
.model)
return
# 2.发射子弹
self
.
bullet_count
-=
1
# 3.提示发射信息
print
(
"[%s]突突突...[%d]"
% (
self
.model
,
self
.
bullet_count
))
def
__str__
(
self
):
return
"恭喜配枪成功"
class
Soldier
:
def
__init__
(
self
,
name):
# 1. 定义新兵的姓名
self
.name = name
# 2.枪
self
.gun =
None
def
fire
(
self
):
# 判断是否有枪
if
self
.gun
is None
:
print
(
"[%s]还没有枪。。。"
%
self
.name)
return
# 高喊口号
print
(
"冲啊。。。[%s]"
%
self
.name)
# 让枪装填子弹
self
.gun.add_bullet(
50
)
# 让枪发射子弹
self
.gun.shoot()
# 1. 创建枪对象
ak47 = Gun(
"AK47"
)
# 2. 创建许三多
xusanduo = Soldier(
"许三多"
)
xusanduo.gun = ak47
xusanduo.fire()
print
(xusanduo.gun)
名片管理系统cards-main:
from
hm_名片管理
import
cards_tool
while True
:
cards_tool.show_menu()
action =
input
(
"请选择操作功能:"
)
print
(
"您选择的操作是:%s"
% action)
# 根据用户输入决定后续的操作
if
action
in
[
"1"
,
"2"
,
"3"
]:
if
action ==
"1"
:
print
(cards_tool.new_card())
elif
action ==
"2"
:
print
(cards_tool.show_all())
elif
action ==
"3"
:
print
(cards_tool.search_card())
elif
action ==
"0"
:
print
(
"欢迎再次使用【名片管理系统】"
)
break
else
:
print
(
"输入错误,请重新输入"
)
card_list = []
def
show_menu
():
"""显示菜单
"""
print
(
"1. 新建名片"
)
print
(
"2. 显示全部"
)
print
(
"3. 查找名片"
)
print
(
"0. 退出系统"
)
def
new_card
():
"""新建名片
"""
print
(
"-"
*
50
)
print
(
"功能:新建名片"
)
# 1. 提示用户输名片的详细信息
name_str =
input
(
"请输入姓名:"
)
phone_str =
input
(
"请输入电话:"
)
qq_str =
input
(
"请输入QQ:"
)
email_str =
input
(
"请输入电子邮件:"
)
# 2. 使用信息建立名片字典
card_dict = {
"name"
: name_str
,
"phone"
: phone_str
,
"qq"
: qq_str
,
"email"
: email_str}
# 3. 将名片字典添加到列表中
card_list.append(card_dict)
print
(card_list)
# 4. 提示用户添加成功
print
(
"用户%s添加成功"
% name_str)
def
show_all
():
"""显示全部
"""
print
(
"-"
*
50
)
print
(
"功能:显示全部"
)
# 打印表头
for
name
in
[
"姓名"
,
"电话"
,
"qq"
,
"邮箱"
]:
print
(name
,
end
=
"
\t\t
"
)
print
(
""
)
# 打印分割线
print
(
"="
*
50
)
for
card_dict
in
card_list:
print
(
"%s
\t\t
%s
\t\t
%s
\t\t
%s
\t\t
"
% (card_dict[
"name"
]
,
card_dict[
"phone"
]
,
card_dict[
"qq"
]
,
card_dict[
"email"
]))
if
len
(card_list) ==
0
:
print
(
"提示:没有任何记录"
)
return
def
search_card
():
"""搜索名片
"""
print
(
"-"
*
50
)
print
(
"功能:搜索名片"
)
find_name =
input
(
"请输入要查找的名字:"
)
for
card_dict
in
card_list:
if
card_dict[
"name"
] == find_name:
print
(
"姓名
\t\t\t
电话
\t\t\t
qq
\t\t\t
邮箱"
)
# 建立标题排面
print
(
"="
*
50
)
print
(
"%s
\t\t\t
%s
\t\t\t
%s
\t\t\t
%s"
% (
card_dict[
"name"
]
,
card_dict[
"phone"
]
,
card_dict[
"qq"
]
,
card_dict[
"email"
]))
# 输出字典中查找的值并排好
print
(
"-"
*
50
)
#
TODO 针对找到的名片进行修改删除
deal_card(find_name)
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_info(
"姓名:"
)
find_dict[
"phone"
] = input_card_info(
"电话:"
)
find_dict[
"qq"
] = input_card_info(
"qq:"
)
find_dict[
"email"
] = input_card_info(
"邮件:"
)
print
(
"%s的名片修改成功"
% find_dict[
"name"
])
elif
action_str ==
"2"
:
card_list.remove(find_dict)
print
(
"删除成功"
)
def
input_card_info
(dict_value
,
tip_message):
"""
:param
dict_value:
:param
tip_message:
:return
:
"""
# 提示用户输入内容
result_str =
input
(tip_message)
# 针对用户输入进行判断,如果用户输入了内容则直接返回结果
if
len
(result_str) >
0
:
return
result_str
# 如果用户没有输入内容,返回 `字典中原有的值`
else
:
return
dict_value
欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/)
黑马程序员IT技术论坛 X3.2