Shinkai005

V1

2022/07/02阅读:12主题:红绯

【Python】python语法补+数据类型(和js对比)

【Python】python语法补+数据类型(和js对比).md

上一篇文章讲到if语句~ 接下来从while开始~

后面有个小游戏demo

后面会讲到切片, 元组, 字典

最后会到高阶函数,装饰器,垃圾回收,模块类,异常处理,文件模块~

我尽力快一些~还要上课我得分主次~sry

while 循环

while false:
  print('hello'# never print
  
  • while true 会死循环~

  • true的位置可以写条件表达式

做下面几个练习玩

练习1: 求100以内所有奇数之和

练习2: 求100以内所有7的倍数之和

练习3: 水仙花数是指一个n位数, 它的每一位上数字的n次幂之和等于他本身(1**3 + 5**3+3**3=153) 求1000以内所有的水仙花数

练习4: 获取用户输入的任意数来判断他是否是指数

真别小瞧这玩意...认真对待每一个简单需求也蛮重要的~

代码如下:

# 练习1: 求100以内所有奇数之和
# a = 1
# res = 0
# while a <= 100:
#     res += a
#     a += 2
# print(res)

# 练习2: 求100以内所有7的倍数之和
# 7, 7*2 , 7*3, ....
# a = 7
# i = 1
# flag = a * i
# res = 0
# while flag <= 100:
#     res += a * i
#     print('flag', flag)
#     print('res', res)
#     print('a', a)
#     i += 1
#     flag = a * i
#
# print('res=', res)
# print('i=', i-1)

# 练习3: 水仙花数是指一个n位数, 它的每一位上数字的n次幂之和等于他本身(1\*\*3 + 5\*\*3+3\*\*3=153) 求1000以内所有的水仙花数
# number = 0
# while number <= 1000:
#     hundreds = number // 100
#     tens = (number - hundreds * 100) // 10
#     ones = (number - hundreds * 100 - tens * 10)
#     res = 0
#     i = 0
#     while i <= 3 and res < number:
#         res = hundreds ** i + tens ** i + ones ** i

#         if res == number:
#             print(f'{res}={hundreds}**{i}+{tens}**{i}+{ones}**{i}')

#         i = i + 1
#     # print(f'hundreds={hundreds} tens={tens} ones = {ones}')
#     number += 1

# 练习4: 获取用户输入的任意数来判断他是否是质数
# number = int(input('输入一个数判断是否是质数'))
# i = 2
# res = True
# while i < number:
#     if number % i == 0:
#         print('最小因数是', i)
#         res = not res
#         break
#     i += 1
#
# print('%s是质数' % number) if res else print('%s不是质数' % number)

想到江哥了

Python 默认print后会自动换行, 输入参数end='',表示不换行

输出这个图形

image-20220628000406020
image-20220628000406020
a = 0
while a < 5:
    b = 0
    while b < 5:
        print('*', end='')
        b += 1
    print('')
    a += 1
image-20220628000533056
image-20220628000533056
a = 0
while a < 5:
    b = 4-a
    while b < 5:
        print('*', end='')
        b += 1
    print('')
    a += 1
image-20220628000731956
image-20220628000731956
a = 0
while a < 5:
    b = a
    while b < 5:
        print('*', end='')
        b += 1
    print('')
    a += 1

外循环保证循环总次数, 也就是行数.

列数就靠内循环来改变了~

输出乘法口诀表~

image-20220628002122601
image-20220628002122601

代码如下

a = 1
while a < 10:
    b = 1
    while b <= a:
        print(f'{b}*{a}={a*b}  ', end='')
        b += 1
    print('')
    a += 1

巧用 内循环的循环变量 和 条件

# a = 1
# while a < 10:
#     b = 1
#     while b <= a:
#         print(f'{b}*{a}={a*b}  ', end='')
#         b += 1
#     print('')
#     a += 1
# a = 1
# while a <= 5:
#
#     if a == 2:
#         a += 1
#         break
#     print(a)
#     a += 1
#

# # 「唐僧大战白骨精」
# end = '、、、、、、、、、、、、、、、、、、、、、、、、、\n'
# # 欢迎页面
# print('''欢迎进入「唐僧大战白骨精」小游戏
# ''', end=end)
# # 身份选择页面
# print('''请选择你的身份:
#         1. 唐僧
#         2. 白骨精
# ''', end=end)
#
# option = int(input('请选择1/2: '))
#
# if option == 1:
#     print('你已经选择 唐僧, 恭喜你将以 唐僧 的身份进行作战!', )
# elif option == 2:
#     option = 1
#     print('什么你竟然选择了白骨精?! 系统将自动为你分配 唐僧 的身份进行作战!', )
# else:
#     option = 1
#     print('输入有误,系统自动为你分配 唐僧 的身份进行作战!')
#
# # 固定的为 唐僧
# role = '唐僧'
# # 状态栏
# role_state_attack = 2
# role_state_health_points = 2
# role_escape = False
# # boss生成
# boss = '白骨精'
# boss_state_health_points = 100
# boss_state_attack = 15
# boss_isAlive = True
# # 进入游戏
# print(f'''你的身份是->{role}<-,
#         你的攻击力是: {role_state_attack}
#         你的生命值是: {role_state_health_points}''')
# print('''你要进行的操作
#         1.练级
#         2.打boss
#         3.逃跑
# 、、、、、、、、、、、、、、、、、、、、、、、、、、、、、
# ''')
# while boss_isAlive is True and role_escape is False:
#     # 语义化拉满,我要的是isAlive 为True进来 并不是他存在进来
#     handle = int(input('请输入1/2/3: '))
#     if handle == 1:
#         role_state_health_points += 20
#         role_state_attack += 20
#         print(f'''你的 身份 是->{role}<-,
#             你的 攻击力 上升了20点,目前是: {role_state_attack}
#             你的 生命值 上升了20点,目前是: {role_state_health_points}''')
#     elif handle == 2:
#         print(f'''你遇到了boss{boss},
#             boss数值如下:
#             生命值{boss_state_health_points}
#             攻击力{boss_state_attack}
#         ''')
#         while True:
#             print(f'你对boss进行了攻击,boss血量 - {role_state_attack}')
#             boss_state_health_points = boss_state_health_points - role_state_attack
#             print(f'boss当前血量为{boss_state_health_points}')
#             if boss_state_health_points <= 0:
#                 boss_isAlive = not boss_isAlive
#                 print(f'boss被你杀了{boss_isAlive}')
#                 break
#
#             print(f'boss对你进行了反击, 你的血量 - {boss_state_attack}')
#             role_state_health_points = role_state_health_points - boss_state_attack
#             print(f'你当前血量为{role_state_health_points}')
#             if role_state_health_points <= 0:
#                 role_escape = not role_escape
#                 print('你被打跑了')
#                 break
#
#     elif handle == 3:
#         role_escape = ~role_escape
#     else:
#         print('浪费了机会,请正确输入')
# if boss_isAlive is False:
#     print('nice player, YOU WIN')
# if role_escape:
#     print('game over, You LOSE')

python 列表list

  1. 列表存储的数据,称之为元素
  2. 列表可以保存任意类型的对象,同时存在也可以
  3. len()可以获取长度
  4. 索引可以是负数,表示从后往前~

剩下写下面了

python 序列sequence

刚那堆操作全部是对序列的,不是列表独有的

序列是python中的基本数据结构

序列分为

  • 可变序列
    • 列表list
  • 不可变序列
    • 字符串 string
    • 元组 tuple

和JavaScript不同点

  • python没有自增运算符
  • python有个小数值共享内存池,验证如下
a = 1
b = 1
print(id(a))  # 4306125040
print(id(b))  # 4306125040
print(id(b) == id(a))  # True
  • python没有数组只有列表
  • python获取长度是要用len()
    • js的length是数组对象的属性直接.调用即可

数组/列表

js索引如果大于当前数报错是underlined

python 报错是list index out of range

数组/列表索引负数

  • python的索引负数是从后往前
  • js的索引负数是给 以该索引为key的属性赋值.并且打印数组是访问不到的.

数组/列表切片slice

my_list = [1234]
print(my_list[-3])  # 2
print(len(my_list))  # 4
print(my_list[0:2])  # [1,2]
print(my_list[1:])  # [2,3,4]
print(my_list[:3])  # [1,2,3]
print(my_list[:])  # [1,2,3,4]
print(id(my_list) == id(my_list[:]))  # False

js切片

a = [1,2,3,4]
console.log(a.slice(0,1)) //[1]
console.log(a.slice(0)) //[1,2,3,4]
console.log(a.slice(2,8)) //[3,4]

唯一相似的地方就是~第二个数如果大于最大长度不会报错~只会打印到最后一位

数组/列表 + 和 *

  • 列表拼接 可以直接用 +

    • js要用concat

    • 用+的话会变成string类型

    • res = a + [1,2,3]
      console.log(typeof(res)) //str
  • 列表重复用*

  • 用 in 和 not in 关键字返回判断元素是否在列表中

    • js类似实现要用 arr.includes('a')
    • find 返回的是当前值, findIndex/indexOf是返回的索引 (他俩区别是findIndex算是升级版,可以传一个回调函数)
  • 写法是: a in list

  • min() 获取最小值

  • max()获取最大值

    • 如果列表里有非数值会报错
    • js可以通过Math.max来找,但是需要将数组变成一系列数值作为参数.
    • Math.max(...arr)
  • s.count('a')可以找列表里有多少a

  • s.index('a') 可以找a的位置,从左往右第一个

    • indexof() findIndex()

字符串变列表

str = 'hello'
print(list(str))  # ['h', 'e', 'l', 'l', 'o']

效果类似 js

str= 'hello'
console.log(str.split(''))// ["h","e","l","l","o"]

列表方法,只可以用于可变序列

骚操作真多..尤其切片, 不用学那么细~ 刷力扣我必然还得用js写

# my_list = [1, 2, 3, 4, 4, 4, 4, 4, '牛逼']
# print(my_list[-3])  # 2
# print(len(my_list))  # 4
# print(my_list[0:2])  # [1,2]
# print(my_list[1:])  # [2,3,4]
# print(my_list[:3])  # [1,2,3]
# print(my_list[10])  # [1,2,3,4]
# print(id(my_list) == id(my_list[:]))  # False
# print(my_list +[5,6,7])
# print(max(my_list))
# str = 'hello'
# print(list(str))  # ['h', 'e', 'l', 'l', 'o']
a = [12345]

# a.append(6)
# a[len(a):len(a)] = (6,)


# a.insert(0, 0)
# a[0:0]=(0,)

# a.extend([6,7,8])
# a+=[6,7,8]
# a[len(a):len(a)] = [6,7,8,9]

# 清空序列
# a.clear()

# a.pop(2) # 删除索引2 ,有返回值
# a.remove(2) # 删除值为2的, 只会删一个

# 反转列表
# a.reverse()

# 排序
str = 'asdsafrewdcs'
b = list(str)
b.sort(reverse=True# 默认顺序升序, 这么传是降序
print(b)


# my_list.remove(0)
print(a)

列表遍历

a = [123456]

# i = 0
# while i < len(a):
#     print(a[i])
#     i += 1

for i in a:
    print(i)   

这块和js有区别

js 的 for in 遍历对象用的 而for of 是遍历数组的~

玩一个命令行CUI版本的增删改查

就这吧...黑不溜秋的CUI我是真用不惯

# 主体页面
res = 0
# 用列表存内容
my_list = [['刘德华'18], ['李建杰'19]]
end = '>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>'
while res != 4:
    res = int(input('''请选择要进行的操作
        1. 查询员工
        2. 添加员工
        3. 删除员工
        4. 退出系统
请选择(1-4): 
    '''
))
    print('', end=end)
    print('')

    # 判断输入选项
    if res == 1:
        if len(my_list) == 0:
            print('还没有员工, 请先 >>添加员工<<')
        else:
            print('\t序号\t\t姓名\t\t\t年龄')
            # print(f'{i}\t{my_list[i]}')
            i = 0
            while i < len(my_list):
                print('', end='\t')
                print(i + 1, end='\t\t')
                for item in my_list[i]:
                    print(item, end='\t\t')
                i += 1
                print('')

            print('', end=end)
            input('任意按键继续......')
    elif res == 2:
        # 没做输入限制~写没做输出类型改变~
        name = (input('请输入 姓名: '))
        age = (input('请输入 年龄: '))
        my_list.append([name, age])
        # my_list.append(input('请输入 性别: '))
    elif res == 3:
        num = int(input('输入删除员工序号'))
        if 0 < num < len(my_list):
            my_list.pop(num - 1)
        else:

            print('请输入正确序号')
            print('', end=end)
            print('')
    elif res == 4:
        print(4)
    else:
        print('输入有误,重新输入')
print('欢迎使用, 再见')

range 整数序列

# 使用range 生成数字序列
# r = range(0, 10, 1)
# 一共三个参数, 第一个起始点, 第二个结束点, 第三个步长(必须整数)
# for i in r:
#     print(i)
# 可以通过range(n) 生成一个执行n次的for循环
n = 10
for i in range(n):
    print('这里写要循环执行的表达式')

for 循环可以遍历任何序列 无论可不可变

字符串, 元组, 列表, range

元组

一点提升-极致追求语义化~

  • 我想语义化拉满~ 就和我的文章一样, 虽然能写的很复杂, 比如拽文言文, 或用诗歌描绘的很隐晦~
    • ​ 但是语义化拉满~更符合现在的我一些~
  • 比如 在js中经常会写 if a 巴拉巴拉
    • 实际的意思就是, 如果a隐式转换后的布尔值为true,我就....
    • 但如果你写这句话的意思是, a必须为True, 就要加限定词~
  • 实际上python 也有,但是python没有隐式转换,因此直观表达出来的意思就是, 这个值存在就进行下一步
  • 但实际上我们要的就是 这个值 为True而不是其他值.
  • 用语义去限制死我们的表达~ if a is Ture:

一开始就要有~代码一定会有bug, 无论更新优化多少次,依旧会有提升空间. ~ (软件工程)

这样的心理下,写代码 写文章,都会更谦虚低调一些. 也更适合成长进步一些.

毕竟这样才能听得进去别人的话

昨天看的至少博士级别以上的人写的学术论文,

他经过自己的批判思维+各种例证之后也不会把自己话语写的绝对.

而是用 应该可以推断出这一点,来防止不一样的观点冲突.

把代码范围写小, 只授权接受我们思考到的点(值), 这样虽然你的代码表达的思想不会特别宏大(实际很空)~ 但是一定很靠谱.

分类:

后端

标签:

Python

作者介绍

Shinkai005
V1

公众号:深海笔记Shinkai