Python 实用技巧若干,确实好用

今天在今日头条上看到一遍适合初学者参考的文章,特别引入这里。原链接及作者见文末。

交换变量的值

a, b, c = 10, 20, 30
print(a, b, c)
a, b, c = b, c, a
print(a, b, c)

输出结果:
10 20 30
20 30 10

链式比较

score = 75
if 70 <= score < 80:
    print('成绩:良')

快速合并字典

dict1 = {
    
    '数学': 90, '语文': 98, '英语': 93}
dict2 = {
    
    '地理': 78, '化学': 70}
dict3 = dict1 | dict2
print(dict3)

输出结果:
{‘数学’: 90, ‘语文’: 98, ‘英语’: 93, ‘地理’: 78, ‘化学’: 70}

标题将两个列表组合成一个字典

key = ['数学', '语文', '英语']
value = [90, 99, 87]
result = dict(zip(key, value))
print(result)

输出结果:
{‘数学’: 90, ‘语文’: 99, ‘英语’: 87}

对列表元素进行随机排序(洗牌效果)

import random

lst = [1, 2, 3, 4, 5, 6, 7, 8, 9, 0]
random.shuffle(lst)
print(lst)

输出结果:
[2, 7, 4, 6, 3, 8, 5, 1, 0, 9]

从列表中选择指定个数的随机且不重复的元素(抽奖效果)

import random

lst = ['z', 'b', 'Ab', 'CDE', '5', 6, 100, True, 3.14]
result = random.sample(lst, 3)
print(result)

输出结果:
[6, ‘z’, ‘CDE’]

从列表或字符串中随机选择一个元素或字符(可用于生成验证码或动态密码)

import random

str1 = '0123456789abcdefghijklmnopqtstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ!@#$%^&*()'
result=''
for i in range(8):
    result = result+random.choice(str1)
print(result)

输出结果:
ZItOAZyC

语音朗读文本

import winsound
import win32com
from win32com.client import Dispatch, constants
import time

speak_out = win32com.client.Dispatch('sapi.spvoice')
str='今天的气温是'+'         '+'零下19度'
speak_out.speak(str)  # 输出方言解释
winsound.PlaySound(str, winsound.SND_ASYNC)  # 输出结束音
time.sleep(3)  # 不加延迟程序马上结束,上面语句的结束音出不来

计算两个日期时间差

import datetime

day1 = datetime.datetime(2022, 7, 17)
day2 = datetime.datetime(2022, 10, 8)
print(f'{day1.strftime("%Y-%m-%d")}与{day2.strftime("%Y-%m-%d")}相隔了' + str((day2 - day1).days) + '天!')

输出结果:
2022-07-17与2022-10-08相隔了83天!

阿拉伯数字快速转换为中文数字

info = ['零', '一', '二', '三', '四', '五', '六', '七', '八', '九']
data = input("请输入数字:")
for i in range(len(data)):
    print(info[int(data[i])], end='')

输出结果:
请输入数字:3698
三六九八

else与for和while搭配使用(如果循环执行完毕,没有遇到break,则执行else)

for num in range(3):
    pwd = input('请输入密码:')
    if pwd == '8888':
        print('输入的密码正确!')
        break
    else:
        print('输入的密码错误,请重新输入!')
else:
    print('输入次数达到上限,系统将自动退出!')

蜂鸣器鸣叫

import time, sys, ctypes
'''
time库中包含sleep延迟函数
sys库中包含stdout标准输出刷新函数flush
ctypes库中包含Beep(首字母大写)蜂鸣器,第一个参数是频率,第二个参数是鸣叫时长
'''
player = ctypes.windll.kernel32
for i in range(1, 11):
    print('\r', '-●-' * i, end='%d0%%' % i) # \r表示返回行首,在字符串里显示%必须用%%
    sys.stdout.flush()
    player.Beep(1000, 100)
    time.sleep(1)

player.Beep(2000, 1000)

异常处理之else和finally(如果未发生异常则执行else,而无论是否发生异常都必须执行finally,即使前面有return语句)

def func(opr):
    result = 0
    try:
        a = int(input('请输入第一个数:'))
        b = int(input('请输入第二个数:'))
        if opr == '+':
            result = a + b
        elif opr == '-':
            result = a - b
        elif opr == '*':
            result = a * b
        elif opr == '/':
            result = a / b
        else:
            print('您输入的操作符错误!')

    except Exception as err:
        print('出错啦!出错信息:', err)
    else:
        print('运行未发生错误')
        return result  # 由于有finally语句,这条return语句会在finally下面的语句执行完毕后再执行
    finally:
        print('-----执行finally语句-----')

r = func('+')
print('返回结果:', r)

运行结果:
请输入第一个数:2
请输入第二个数:0
运行未发生错误
-----执行finally语句-----
返回结果: 2

字符串内容逐字循环输出

import sys
import time
def repeat(string):
    sys.stdout.write("\r")        # 回车,让光标回到行首
    sys.stdout.flush()            # 刷新,即输出缓冲区数据
    for i in string:             # 遍历字符串
        sys.stdout.write(i)    # 写到缓冲区
        sys.stdout.flush()        # 输出
        time.sleep(0.3)           # 延迟0.3毫秒

while True:
    repeat('ABCDEFGHIJKLMNOPQRSTUVWXYZ')

将字符串中数量不等的连续空格统一变成一个空格

word='编号   姓名           性别 年级      学校   奖项'
list=word.split(' ')
listnew=[i for i in list if i!='' ]
new=' '.join(listnew)
print(new)

输出结果:
编号 姓名 性别 年级 学校 奖项

巧用列表判断日期对应星座(不需要反复判定月份和日期范围)

def sign(m, d):  # 判断星座函数
    if d < date[m - 1]:  # 如果日期小于该月在date列表中对应的日期临界值
        print(sign_list[m - 1])  # 直接输出星座列表中对应月份的星座
    else:
        print(sign_list[m])  # 否则输出星座列表中下一月对应的星座


date = [20, 19, 21, 20, 21, 22, 23, 23, 23, 24, 23, 22]  # 每个月份的星座日期临界值
sign_list = ['摩羯座', '水瓶座', '双鱼座', '白羊座', '金牛座', '双子座', '巨蟹座', '狮子座', '处女座', '天秤座',
             '天蝎座', '射手座', '摩羯座']

sign(7, 15)  # 调用星座判断函数

输出结果:
巨蟹座

巧用字典判断身份证号信息(字符 \ 用于连接上下两行语句)

dic = {
    
    '11': '北京市', '12': '天津市', '13': '河北省', '14': '山西省', \
       '15': '内蒙古自治区', '22': '吉林省', '23': '黑龙江省', '31': '上海市', \
       '32': '江苏省', '33': '浙江省', '35': '福建省', '36': '江西省', '37': '山东省', \
       '41': '河南省', '42': '湖北省', '44': '广东省', '45': '广西壮族自治区', \
       '46': '海南省', '50': '重庆市', '51': '四川省', '53': '云南省', \
       '54': '西藏自治区', '61': '陕西省', '62': '甘肃省', '63': '青海省', \
       '65': '新疆维吾尔自治区', '71': '台湾省', '81': '香港', '82': '澳门'}

def idget(str):
    if dic.get(str):
        return dic[str]
    else:
        return '未知省份'

instr = input('请输入您的身份证号:')

if instr[:16].isdigit() and len(instr) == 18:
    print('你来自:', idget(instr[0:2]))
    print('你的生日是:' + instr[6:10] + '年' + instr[10:12] + '月' + instr[12:14] + '日')
    gender = '女' if int(instr[16]) % 2 == 0 else '男'
    print('你的性别是:' + gender)

输出结果:
请输入您的身份证号:220000198308124527
你来自: 吉林省
你的生日是:1983年08月12日
你的性别是:女

巧用随机数和字符串切片完成成语答题效果

import random

list = ["春暖花开", "十字路口", "千军万马", "白手起家", "张灯结彩", "风和日丽", "万里长城", "人来人往", "自由自在",
        "瓜田李下", "助人为乐", "白手起家", "红男绿女", "春风化雨", "马到成功", "拔苗助长", "安居乐业", "走马观花",
        "念念不忘", "落花流水", "张灯结彩", "一往无前", "落地生根", "天罗地网", "东山再起", "一事无成", "山清水秀",
        "别有洞天", "语重心长", "水深火热", "鸟语花香", "自以为是"]
i = 1
count = 20
print('直接填写答案,回车进入下一关。什么也不填忽略本成语!!')
while True:
    word = random.choice(list)  # 随机选择成语
    bank = random.randint(0, 3)  # 随机生成要抹去的字
    new = word[:bank] + "___" + word[bank + 1:]  # 输出考题
    print(new)
    num = input("输入:")
    if not num:  # 如果直接回车则略过此题
        print("过!")
        continue
    elif num.strip(" ") == word[bank]:
        count += 2
        print("正确,你真棒!")
    else:
        count -= 2
        print("错了,正确答案:", word[bank])
    i += 1
    if i > 3:  # 答题次数
        break
print("选手最后得分:", count)

输出结果:直接填写答案,回车进入下一关。什么也不填忽略本成语!!
风和___丽
输入:日
正确,你真棒!
往无前
输入:
过!
马到成

输入:功
正确,你真棒!
自___自在
输入:由
正确,你真棒!
选手最后得分: 26

根据日期生成产品序列号

type_num = "BRM8S"
date = "2021:12:28"
date = date.split(":")
year_num = date[0][2:]
month = hex(int(date[1])).replace("0x", "")  # 取月份的十六进制字符
day = date[2]
date_num = year_num + month + day
start = 100
count = int(input("请输入要生成的产品序列号(SN)数量:"))
sn = ""
for i in range(count):
    num = type_num + date_num + str(start + i).zfill(5)  # 用0填充空位
    sn += num + "\n"
print(sn)

以横式条形图的形式形象展示GDP数据

gdp = '广东:97277.77:107671.07 江苏:92595.40:99631.52 ' \
      '山东:76469.70:71067.5 浙江:56197.00:62353 河南:48055.90:54259.2 ' \
      '四川:40678.10:46615.82 湖北:39366.60:45828.31 湖南:36425.78:39752.12 ' \
      '河北:36010.30:35104.5 福建:35804.04:42395'
gdp_dict = {
    
    }
gdp_list = []
base = 3000
new = gdp.split(" ")  # 切割列表
for item in new:
    gdp_list = item.split(":")  # 切割字符串
    gdp_dict.update({
    
    gdp_list[0]: [gdp_list[2], gdp_list[1]]})  # 生成字典
up = sorted(gdp_dict.items(), key=lambda x: float(x[1][0]), reverse=False)  # 使用匿名函数对字典排序
for item in up:
    lenb = format(float(item[1][0]) / base, ".0f")  # 计算需要输出的■的个数
    print(item[0].ljust(4) + "\t" + int(lenb) * chr(9632) + "  2019年GDP:" + str(item[1][0]))
    lenb = format(float(item[1][1]) / base, ".0f")
    print("".ljust(4) + "\t" + int(lenb) * chr(9632) + "  2018年GDP:" + str(item[1][1]))

输出结果:
河北 ■■■■■■■■■■■■ 2019年GDP:35104.5
   ■■■■■■■■■■■■ 2018年GDP:36010.30
湖南 ■■■■■■■■■■■■■ 2019年GDP:39752.12
   ■■■■■■■■■■■■ 2018年GDP:36425.78
福建 ■■■■■■■■■■■■■■ 2019年GDP:42395
   ■■■■■■■■■■■■ 2018年GDP:35804.04
湖北 ■■■■■■■■■■■■■■■ 2019年GDP:45828.31
   ■■■■■■■■■■■■■ 2018年GDP:39366.60
四川 ■■■■■■■■■■■■■■■■ 2019年GDP:46615.82
   ■■■■■■■■■■■■■■ 2018年GDP:40678.10
河南 ■■■■■■■■■■■■■■■■■■ 2019年GDP:54259.2
   ■■■■■■■■■■■■■■■■ 2018年GDP:48055.90
浙江 ■■■■■■■■■■■■■■■■■■■■■ 2019年GDP:62353
   ■■■■■■■■■■■■■■■■■■■ 2018年GDP:56197.00
山东 ■■■■■■■■■■■■■■■■■■■■■■■■ 2019年GDP:71067.5
   ■■■■■■■■■■■■■■■■■■■■■■■■■ 2018年GDP:76469.70
江苏 ■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■ 2019年GDP:99631.52
   ■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■ 2018年GDP:92595.40
广东 ■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■ 2019年GDP:107671.07
   ■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■ 2018年GDP:97277.77

利用字符串子串个数统计功能实现敏感词汇统计

word = input('请输入或者拷贝含有敏感词的宣传文字:\n')
sensitive = ['第一', '国家级', '最高级', '最佳', '独一无二', '一流', '仅此一次', '顶级', '顶尖', '尖端', '极品', '极佳',
             '绝佳', '绝对', '终极', '极致', '首个', '首选', '独家', '首发', '首次', '首款', '金牌', '名牌', '王牌',
             '领袖', '领先', '领导', '缔造者', '巨星', '掌门人', '至尊', '巅峰', '奢侈', '资深', '之王', '王者', '冠军']
sensitive_find = []
newword = word
for item in sensitive:
    if word.count(item) > 0:  # 判断敏感词出现的次数
        sensitive_find.append(item + ':' + str(word.count(item)) + '次')  # 记录敏感词出现次数
        newword = newword.replace(item, '  \033[1;31m' + item + '\033[0m')  # 敏感词描红输出
print('发现敏感词如下:')
for item in sensitive_find:
    print(item)
print('敏感词位置已用星号进行标注:\n' + newword)

输出结果:
请输入或者拷贝含有敏感词的宣传文字:
他的技术绝对一流,堪称全国第一,国家级大师!
发现敏感词如下:
第一:1次
国家级:1次
一流:1次
绝对:1次
敏感词位置已用星号进行标注:
他的技术 绝对 一流,堪称全国 第一, 国家级大师!
利用匿名函数和max函数取出数字字符串中的最大数
num = ‘2748123’
max_num = max(num, key=lambda x: int(x))
print(max_num)
输出结果:
8

利用字符串替换方法去除指定子字符串

with open('users.txt') as rfile:
    str1 = rfile.readline()
    str2 = str1.replace('\n', '')
    print(str1 == str2)
输出结果:
False
利用列表推导式去除指定子字符串
word = '赵 钱 孙 李 周 吴 郑 王'
word = ''.join([i for i in word if i != ' '])
print(word)

输出结果:
赵钱孙李周吴郑王
利用字符串切片去除指定位置的子字符串
str = ‘我爱40982345Python!’
new_str = str[:2] + str[10:]
print(new_str)
输出结果:
我爱Python!
使用汉字转拼音模块对汉字以拼音为序进行排列

导入汉字转拼音模块

from xpinyin import Pinyin

names = ['张三', '李四', '王五', '赵六', '田七']
pin = Pinyin()  # 创建汉字转拼音对象

temp = []  # 保存转换结果的空列表
for i in names:
    # 获取汉字的拼音,跟汉字组合成元组放到临时列表中
    temp.append((pin.get_pinyin(i), i))
print(temp)  # 输出获取拼音后的列表
temp.sort()  # 对列表进行排序
result = []  # 保存排序后的列表
for i in range(len(temp)): 
    result.append(temp[i][1])  # 取出汉字保存到新列表中
print(result)

输出结果:
[(‘zhang-san’, ‘张三’), (‘li-si’, ‘李四’), (‘wang-wu’, ‘王五’), (‘zhao-liu’, ‘赵六’), (‘tian-qi’, ‘田七’)]
[‘李四’, ‘田七’, ‘王五’, ‘张三’, ‘赵六’]

以上内容引自今日头条,原作者:知者不惑FYK,见以下链接。
https://www.toutiao.com/article/7174969369184223802/

猜你喜欢

转载自blog.csdn.net/any1where/article/details/128424489