作业解答

"""
作业解答
第一题:找出两个列表中相同元素,并打印出来
第二题:
判断用户输入的是不是一个手机号码 
需求一:以1开头
需求二:长度是11位 len()
需求三:纯数字
​
"""
# 方法1
list1 = [1, 2, 3, 7, 12, 29]
list2 = [5, 6, 7, 8, 9, 0]
result = []
for i in list1:
    if i in list2:
        result.append(i)
print(result)
# 方法2
st1 = set(list1)
st2 = set(list2)
print(st1 & st2)
​
work1 = input('请输入手机号码进行判断:')
if work1[0] == '1':
    if len(work1) == 11:
        if work1.isdigit():
            print('您输入的内容是一个电话号码')
        else:
            print('您输入的内容不是纯数字,所以该内容不是一个电话号码')
    else:
        print('您输入内容长度不足11位,所以该内容不是一个电话号码')
else:
    print('您输入的内容不是以1开头的,所以该内容不是一个电话号码')

基本概念

"""
基本概念以及基本的数据类型
"""
​
# 概念
""" 
1.变量
1.1作用:存储数据
1.2命名规范:字母、数字、下划线组成,其中不能以数字开头
1.3引用:如果在同一个程序里面出现名字一样的变量,则以最下面的变量为最终结果
1.4注意:关键字与内置函数不能够作于变量名
语法格式:
    变量名 = 值
"""
name = '张三'
age = 30
​
"""
2.关键字
    2.1作用:帮助我们实现一些特定的功能
    2.2汇总:查看关键字列表
    (在默认的pycharm版式中,关键字为橙色)
    import keyword
    print(keyword.wklist)
"""
import keyword
​
print(keyword.kwlist)
​
"""
3.内置函数
    3.1作用:帮助我们对于变量进行一些特点的需求
    3.2汇总:查看内置函数列表
    (在默认的pycharm版式中,内置函数为紫色)
    print(dir(__builtins__))
"""
num1 = 3.1415926
new_num1 = int(num1)
print(new_num1)
​
print(type(num1))
print(type(new_num1))
​
"""
4.输入和输出
    4.1 输入 -> input(提示内容) 通常使用变量接收输入的内容
    **输入之后的数据都是以字符串的形式保存的,如果想要进行数字计算,则需要更改数据类型(最后讲)
    4.2 输出 -> print(内容, sep='', end='') 对于变量的内容或者直接输入内容进行输出打印,打印的数据类型不限
    sep:当输入多个值时,可以指定值之间使用什么进行分隔
    end:可以指定输出值的末尾以什么结束
"""
data = input('请输入你想输入的内容:')
print('接收的内容为:', data, sep='&', end='||\n')
​
# 计算用户输入矩形的面积
length = int(input('请输入矩形的长度:'))
width = int(input('请输入矩形的宽度:'))
​
area = length * width
print('矩形的面积为:', area)

数据类型

在开始总结六大数据类型的内容前,这里给大家说一个六大类型其他的概念,之前有的同学问,为什么有一些数据类型可以在原来的变量上修改,而另外的一些数据类型则需要额外打印出来呢

"""
六大数据类型
    1.数值类型:int 、float、bool
    2.字符串 str
    3.列表 list
    4.元组 tuple
    5.字典 dict
    6.集合 set
"""
"""
序列类型与散列类型
序列类型
字符串 str
列表 list
元组 tup
只有序列类型会存在索引/下标
且字符串只能存储字符
列表与元组可以存储任何数据类型
​
散列类型
字典 dict
集合 set
散列类型都为无序的集合
字典有键值对,所以可以增删改查
集合无序,只能进行增加与删除
"""
# 只有序列类型才有对于索引获取值和索引切片获取值
_list = ['内容1', '内容2']
print(_list[1], type(_list))  # 索引获取值
_str = '这是一个字符串'
print(_str[4:7])  # 切片获取部分值
"""
可变与不可变对象
"""
"""
可变对象 -> 变量 :
列表 list
字典 dict
集合 set
创建后可以修改它们的值,且随着时间的推移而发生变化,且内存储存位置也可能会发生变化
"""
new_dict = {'1': 1, '2': 2, '3': 3}
new_dict['1'] = '修改键为1位置的值'  # 修改之后不用使用参数接收直接在元字典上修改
print(new_dict)
​
"""
不可变对象 -> 常量:
数值类型 int float
字符串 str
元组 tuple
创建之后无法修改它们的值,内存存储位置不会发生变化
"""
new_str = '这是一串字符串'
new_str.replace('串', '行')  # 替换不会在原字符串上进行,需要打印或者用变量接收
print(new_str)
​
"""
整型int 与 浮点型float
    用作于:
    数学运算
    价格、分数等
"""
age = 20  # 整型int
grade = 85
print('今年我{}岁,这次的期末考试我考了{}分'.format(age, grade))
# 数值的运算
num1 = 3
num2 = 10
print(num1 + num2)  # 加 +
print(num2 - num1)  # 减 -
print(num1 * num2)  # 乘 *
print(num2 / num1)  # 除 /
print(num2 // num1)  # 整除 //
print(num2 % num1)  # 取余 %
print(num2 ** num1)  # 幂运算 **
​
# float的高精度运算
print(1.2 - 1.1)  # 平常的浮点型运算数据会缺失
# 使用decimal模块即可解决浮点数精度缺失
import decimal
​
print(decimal.Decimal('1.2') - decimal.Decimal('1.1'))
"""
bool() 布尔值判断
    True  
    对数字类型来说,非0的所有数都会输出为True
    对其他数据类型来说,只要是非空的变量都会输出为False
    False
"""
# print(bool(-1))  # True
# print(bool(0))  # False
print(True + 0)  # 布尔值的运算 True 为 1
print(False + 1)  # False为0
"""
比较运算符
> 大于
< 小于
>= 大于等于
<= 小于等于
== 等于
!= 不等于
特点:
比较运算符的返回结果都是bool型
字符串和数值不能比较
字符串只能和字符比较
"""
a = 3
b = 6
print(a > b)  # a并不大于b 所以输出的值为False
print(a < b)  # a小于b 所以输出的值为true
print(1 == '1')  # 字符串与数值不能比较,所以输出的值为False
print('a' > 'A')  # 因为在ascii码表上a对于的数值是97 而A对应的数值是65
​
"""
字符串类型 str
    定义方式:单引号,双引号,以及单三引号、单双引号都可以创建(只有三引号可以换行)
    通过内置函数 str() 也可以定义字符串
"""
str1 = '这是单引号定义的字符串'
str2 = "这是双引号定义的字符串"
str3 = '''这是单三引号定义的字符串'''
str4 = """这是双三引号定义的字符串"""
# 内置函数定义
str5 = str(12312312)
print(str5)
​
"""
字符串的拼接
    方法1:使用加号 + 进行拼接
    方法2:使用占位符%s进行拼接
    方法3:使用join方法进行拼接
    方法4:使用format方法进行拼接
"""
word1 = 'today is '
word2 = 'a good day. '
new_word = word1 + word2  # 加法拼接 前后
# new_word1 = word1 + 1  # 字符串只能跟字符串拼接,要是跟数字拼接将会报错
print(new_word)
​
print('%s%s' % (word1, word2))  # 占位符%s进行拼接
​
print(''.join([word1, word2]))
​
print('{}{}'.format(word1, word2))  # 使用format格式化进行拼接
# 最简单的字符串拼接以及在字符串内容里显示变量的内容
print(f'拼接的内容为:{word1}{word2}')
​
# 字符串的乘法
new_word1 = word2 * 3  # 乘法 复制字符串内容进行输出
print(new_word1)  # 乘法之后只能是数字,否则会报错
​
""" 
字符串的多种使用方法
    replace() 替换
    split() 分割
    find() 查找
    转义字符 \t:制表符 \n:换行符
"""
str5 = '天天都想有一个好天气'
# replace 将想修改的文字进行替换
print(str5.replace('天', '每', 1))  # 将天换成每,控制只换一次
​
# split 将字符串分割成列表类型
str6 = '吃饭、睡觉、打豆豆'
print(str6.split('、'))
print(str6.split('、', 1))  # 分割也可以控制次数
​
# find 对于字符串查找元素第一次出现的位置
str7 = 'hello world'
print(str7.find('l'))  # 查找字符l第一次出现的索引位置
​
# 转义字符  \t:制表符  \n:换行符
print('你\t\t好')  # 使字符直接有3个字符串分隔
print('你\t\t吃饭了没')  # 连续使用两个制表符可以将输出进行对齐
​
print('第一行\n第二行')  # 使得字符换行打印
# 取消转义字符: 如果在文件打开时有t开头的文件名需要取消转义字符时可以在前面多加一根右斜线
with open('D:\softData\PycharmProjects\ChengQuEdu\\textfile.txt') as f:
    print(f.read())
​
"""
字符串其他使用方法
"""
str8 = '    this is a str'
print(str8.strip())  # strip() 去除字符串首尾空值
print(str8.title())  # title() 所有单词首字母大写
​
​
"""
列表 list
定义:使用中括号包裹以逗号分隔
对于列表的增删改查
"""
list1 = ['同学1', '同学2', '张三']
# 列表的增加 append()、insert()、extend()
list1.append('李四')  # append 在列表的末尾添加想要添加的元素
list1.insert(0, '王五')  # insert 在列表指定位置添加元素
list1.extend(['元素1', '元素2'])  # extend 批量添加元素至列表末尾,批量的元素用中括号包裹,以逗号分隔
print(list1)
​
# 列表的删除 pop()、remove()、clear()、del
list1.pop()  # pop() 括号内不输入值即为默认删除最后一个元素
list1.pop(1)  # 括号内输入的数字为指定元素的索引
list1.remove('李四')  # remove为删除指定的元素
del list1[0:3]  # del 配合元素切片的方式进行一个批量删除
list1.clear()  # clear 将列表里所有的元素清空
print(list1)  # 注意:在以后编写的程序中,删除的内容是无法恢复的
​
# 列表的修改:利用索引的位置可以直接修改指定位置的值
list2 = ['同学1', '同学2', '同学3']
print(list2)
list2[1] = '孑然'  # 将索引位置为1的元素进行更改
print(list2)
​
# 列表的查询
# 1、使用关键字in 和 not in 判断元素是否在列表中,输出为布尔类型
print('孑然' in list2)  # True
print('张三' in list2)  # False
​
print('孙悟空' not in list2)  # True
print('同学1' not in list2)  # False
​
# 2、使用index()查询元素在列表中的索引位置
print(list2.index('孑然'))  # 1
# 如果index查询的内容在列表中不存在就会报错
# print(list2.index('小白'))  # '小白' is not in list
​
# 列表中的其他方法
# copy()、count()、reverse()、sort() -> 针对与数字使用
​
numbers = [4, 3, 6, 3, 5, 3, 7, 6, 3, 5, 7]
# copy() 将存在的列表内容复制给新列表
new_numbers = numbers.copy()
print(numbers)
print(new_numbers)
​
# count() 统计列表中一个元素出现的次数
print(numbers.count(3))  # 4
print(numbers.count(6))  # 2
​
# reverse() 将列表中的内容反转排序
numbers.reverse()
print(numbers)
​
# sort() 单独使用默认为升序,括号中使用reverse = True则为降序
numbers.sort()
print(numbers)
numbers.sort(reverse=True)
print(numbers)
​
"""
元组 tuple
使用小括号()包裹,以逗号分隔
"""
tuple1 = ('山竹', '榴莲', '西瓜')
print(type(tuple1))
print(tuple1)
​
tuple2 = ('哈密瓜',)  # 如果只有一个元素,也要跟上逗号,否则识别成字符串
print(type(tuple2))
​
# 元组为不可变类型,只能进行查询
# 根据索引查询
print(tuple1[0])
​
# 元组的拆包:将元组中以逗号分隔的元素,用多个变量接收
a, b, c = tuple1
print(a, b, c)
​
x, *y = tuple1  # 也可以在变量前添加*号,使变量接收多个元素
print(x)
print(type(y))  # 接收多个元素的变量为列表类型
print(y)
​
"""
字典 dict
定义1:使用花括号包裹,元素为一对键值对,键与值之间用引号连接
定义2:使用内置函数dict()创建,里面的键值对用等号连接,对于键的命名格式为:字母或者下划线开头,后面跟任意字母、数字以及下划线
"""
dict1 = {'1': '同学1', '2': '同学2', '3': '同学3'}
​
dict2 = dict(a1=1, _b2=2)
print(dict2)
# 空字典创建
empty_dict = {}
"""
字典的各种方法
"""
# 查询
# 1、根据键内容获取值
print(dict2['a1'])
# print(dict2['c'])  # 如果不存在则会报错
# 2、使用get()方法获取
print(dict2.get('a1'))
print(dict2.get('c'))  # 使用get查询值,如果不存在会返回None
​
print(dict2.get('c', '所输入的键不在此字典中'))  # 查找不到时可以指定返回数据
# 增加与修改 通过健获取列表位置修改值的内容,同时可以用此方法新增键值对
# 修改
dict1['1'] = '修改后的数据'
print(dict1)
# 增加
dict1['4'] = '新增的值数据'
print(dict1)
​
# 内置函数方法 setdefault 与 update
# setdefault 查询/新增
print(dict1.setdefault('1', '张三'))  # 如果输入的键没有内容则添加空格后面的数据
# update 修改/新增
print({'a': 'b', '1': '被update修改后的值'})  # 对于已存在的键,可以对其值进行修改,如输入的键不存在,则添加对应键值对
​
# 删除 pop()、popitem()、del
dict3 = {'1': '张三', '2': '李华', '3': '李四', '4': '同学1'}
print(dict3.pop('3'))  # 打印的为被删除的值
print(dict3.popitem())  # 本质为随机删除,在3.6版本之后默认删除最后一个键值对
# del dict3['4']  # 根据输入的键删除值,输入不存在的值会报错
print(dict3)
​
"""
获取字典视图:
单独提取字典中的键或者值,或者每一对键值对
"""
print(dict3.keys())  # 获取键
print(dict3.values())  # 获取值
print(dict3.items())  # 获取键值对
# 分别将他们遍历
for k in dict3.keys():  # 遍历键
    print(k)
​
for v in dict3.values():  # 遍历值
    print(v)
​
for k, v in dict3.items():  # 遍历键值对
    print(f'键的值为:{k},值为:{v}')
​
"""
集合 set
由花括号包裹,以逗号分隔
特性:去重
"""
set1 = set()   # 空集合创建,{}创建为空字典
​
# 将列表转为集合类型
li = [1, 5, 1, 2, 3, 5, 6, 7, 10]
set2 = set(li)
print(set2)  # 集合类型会自动去重
​
# 集合内容无序
set3 = {'同学1', '同学2', 12312, 565423, '孑然'}
print(set3)  # 每一次打印,内容的顺序都会改变
​
"""
集合的运算
交集 -> &
并集 -> |
差集 -> -
"""
st1 = {1, 2, 3, 'c'}
st2 = {2, 3, 4, 'a'}
# 交集
print(st1 & st2)  # 输出为两个集合中相同的元素
# 并集
print(st1 | st2)  # 输出两个集合中所有的数据,且自动去重
# 差集
print(st1 - st2)  # 输出前面集合有,后面集合没有的元素
​
"""
集合的增删改查
add()    增加一个元素
update() 增加多个元素
pop()    随机删除 -> 在集合中元素无序
remove() 删除指定元素
"""
# add() 在存在的集合内添加一个元素
s1 = {1, 2, 3, 4}
s1.add('同学x')
print(s1)
​
# update({值1, 值2, 值n}) 添加多个元素
s1.update({'同学1', '同学2', '同学n'})
print(s1)
​
# pop() 在集合中为:随机删除一个元素(因为集合中数据无序的原因)
s1.pop()
print(s1)
​
# remove(元素名) 删除指定元素
s1.remove('同学x')
print(s1)

if条件语句

"""
if条件语句
对于一些情况判断后做出相应对策
if 判断条件:
    满足条件执行的代码
elif 判断条件:
    满足条件执行的代码
else:
    不满足条件执行的代码
"""
# 红绿灯指示
light = input('请输入目前红绿灯的状态:')
if light == '红灯':
    print('静止通行')
elif light == '黄灯':
    print('即将变为红灯,建议等待绿灯亮起后通行')
elif light == '绿灯':
    print('正常通行')
else:
    print('输入状态错误')
​
# 三目运算 将if条件语句写在一行
​
# 判断一个值是否大于5
a = int(input('请输入你要判断的数:'))
print('此时a的值大于5' if a > 5 else '此时a的值小于5')
​
# 如果a的值大于5,b的值为10,反之b的值为0
b = 10 if a > 5 else 0
print('b的值为:', b)
​
"""
if嵌套
将if语句内嵌,进行多次判断
"""
"""
假如你在设计一个打折系统,需要根据不同的会员等级来计算折扣。该系统共分为普通会员、黄金会员、钻石会员三个等级,
其中,不同等级的会员享有不同的折扣优惠。如果是普通会员,则不享有任何优惠。
如果是银牌会员,则享有95折优惠。如果是金牌会员,则享有9折优惠。
"""
# 分析:需要创造的变量:1.消费金额 2.会员等级 3.折扣率 4.打折之后的价格
price = int(input('请输入你本次消费的金额:'))  # 定义消费金额变量
member_level = input('请输入你目前的会员等级:')  # 定义由用户自己输入的会员等级
if member_level == '普通会员':  # 进行if的外层条件判断
    print(f'对不起您没有任何优惠,所以您最后的消费金额为:{price}元')
else:
    if member_level == '黄金会员':    # 进行if的内层条件判断
        discount = 0.95
        final_price = price * discount
        print(f'尊敬的{member_level},您最终的消费金额为:{final_price}元')
    elif member_level == '钻石会员':
        discount = 0.9
        final_price = price * discount
        print(f'尊贵的{member_level},您最终的消费金额为:{final_price}元')
    else:
        print('你输入的会员等级有误')
​
"""
逻辑判断
或 or
与 and
非 not
​
逻辑短路
如果能提前得到运算结果,则不再运行后面的代码
"""
# or  全假则假,否则为真
n1 = 10
if n1 < 2 or n1 > 7:
    print(True)
else:
    print(False)
​
print(n1 > 5 or n100 < 1)  # 当前面为真时,则不会运行后面的代码
​
# and 全真为真,否则为假
n2 = 5
if n2 < 6 and n2 > 10 :
    print(True)
else:
    print(False)
​
print(n2 > 6 and n10000 > 1)  # 当前面为假时,就不会运行后面的代码
​
# not 取反,将结果与判断内容相反
x = 1
y = 2
if not (x < y):
    print(True)
else:
    print(False)

while循环与for循环

"""
循环语句
用于重复执行某行代码,满足特定条件就会不断执行循环中的语句
"""
# while循环
# 依次打印数字1-100
a = 1
while a < 101:
    print(a)
    a += 1
# while死循环 当条件表达式为真时,就会不断打印下面的代码
# while True:
#     print(a)
#     break
# break 跳出循环的方法,可指定在何时跳出循环
b = 1
while True:
    if b == 10:
        print('当b等于10时,使用break关键字在此停止')
        break
    print(b)
    b += 1
​
# continue 跳过本次的循环,在指定位置跳出当前循环
c = 0
while c < 10:
    c += 1
    if c == 9:
        print('此时c的值为9,跳过打印')
        continue
    print(c)
​
# while循环嵌套
# 打印一个长为5宽为3的矩形
i = 0
while i < 3:
    row = ''
    i += 1
    j = 0
    while j < 5:
        row += '*'
        j += 1
    print(row)
​
# 循环中搭配else使用:
x = 1
while x < 6:
    print(f'目前是第{x}次循环')
    x += 1
else:
    print('循环完成')
​
# for循环
# 遍历
str1 = '这是一个字符串'
for i in str1:
    print(i)
​
# 搭配range函数控制次数进行循环
# 创造2-100的循环,只输出偶数
for i in range(2, 101, 2):  # 在两个数值后面加一个数控制步长
    print(i)
​
# for循环中使用break和continue
for i in range(1, 11):
    if i == 5:
        # print('将5跳过打印')
        continue
    if i == 10:
        # print('取消打印10')
        break
    print(i)
​
# for循环与else一起使用
for i in range(1, 5):
    print(f'正在进行第{i}次循环')
else:
    print('循环完成')