Python进阶——对Python“脚本”的理解与使用

stm32f103呼吸灯(PWM脉冲宽度调制) stm32f103呼吸灯(PWM脉冲宽度调制)一、PWM脉冲宽度调制二、硬件说明三、编程实现1、硬件相关宏定义2、GPIO初始化3、定义 PWM表4、定时器 PWM配置5、定时器中断服务函数6、计算拟合周期四、呼吸灯演示1、PWM输出波形2、呼吸灯![在这里插入图片描述](https://img-blog.csdnimg.cn/20201230113316271.gif#pic_center) 一、PWM脉冲宽度调制 1、使用脉冲占空比拟合不同波形的方式称为 PWM(脉冲宽度调制)控制技术——通过 对一系列 阅读详情

前言

本篇文章主要内容为使用 Python 编写一些实用的脚本,来方便我们的日常使用(只要敢想,就敢创作)。
日常我们写前端后端的,经常使用数据库,用的最多的就是 mysql ,在python中常用 pymysql 这个库操作 mysql ,通常需要编写不少sql代码,还要预防 sql 注入,我们就可以使用简单的增删改查语句生成函数来帮助我们快速生成语句,减少不必要耗时;而且通常需要定义大部分实体类来帮助完善模型。比如在使用 fastapi 的时候,就需要使用 BaseModel 的子类来作为模型类,给予类型判断与定义数据格式。每个实体类如果都要单独写sql语句什么的,可能还要检查是否有数据库、数据表等,就比较麻烦,建立一个统一的类能够减少我们日常无用开发,当然sql简单点支持增删改查,那些子查询、左连接右连接的,在面对小流量小访问的时候,可以使用多次查询,对于 Python 来讲会比较轻松,对于复杂查询还是通过完整的sql语句实现。

数据库帮助类

这想法是我在实际使用、 django 自动创建数据库、数据表,看到 Java 有个 DBHelper 类时产生的,感觉不错,分享一下。

信息设置函数

这里能够设置基础的连接信息,由于 Python 导入文件后属于单例模式,所以设置一次,程序整个生命周期将都使用设置后的变量。

MYSQL_HOST = 'localhost'
MYSQL_PORT = 3306
MYSQL_USER = 'root'
MYSQL_PASSWORD = ''
MYSQL_DATABASE = ''
RESTART_INIT = True

mysql = ...
cursor = ...


def setting(host='localhost', port=3306, user='root', password='password', database='database', init=True):
    """
    设置全局变量
    :param host: 数据库主机名(地址)
    :param port: 数据库端口
    :param user: 数据库用户
    :param password: 数据库用户密码
    :param database: 数据库名
    :param init: 每次启动程序是否初始化数据库
    :return: NoReturn
    """
    global MYSQL_HOST, MYSQL_PORT, MYSQL_USER, MYSQL_PASSWORD, MYSQL_DATABASE, RESTART_INIT, mysql, cursor
    MYSQL_HOST = host
    MYSQL_PORT = port
    MYSQL_USER = user
    MYSQL_PASSWORD = password
    MYSQL_DATABASE = database
    RESTART_INIT = init
    try:
        mysql = pymysql.connect(
            host=MYSQL_HOST,
            port=MYSQL_PORT,
            user=MYSQL_USER,
            password=MYSQL_PASSWORD,
            charset='utf8mb4',
            cursorclass=pymysql.cursors.SSDictCursor
        )
        cursor = mysql.cursor()
        if RESTART_INIT:
            cursor.execute(f'DROP DATABASE IF EXISTS `{MYSQL_DATABASE}`;')
        cursor.execute(f'CREATE DATABASE IF NOT EXISTS `{MYSQL_DATABASE}`;')
        mysql.commit()
        cursor.close()
        mysql.close()

        mysql = pymysql.connect(
            host=MYSQL_HOST,
            port=MYSQL_PORT,
            user=MYSQL_USER,
            password=MYSQL_PASSWORD,
            database=MYSQL_DATABASE,
            charset='utf8mb4',
            cursorclass=pymysql.cursors.SSDictCursor
        )
        cursor = mysql.cursor()
    except pymysql.err.OperationalError:
        print('用户名和密码不匹配!')
        logging.exception(f'用户名 {MYSQL_USER} 和密码 {MYSQL_PASSWORD} 不匹配!')
        time.sleep(.01)
        exit('虽然程序异常退出了,但不要慌,一切尽在我的掌握之中!')
    except pymysql.Error as e:
        print(f'exception: {e.args}')
        logging.exception(e.args)
        exit('虽然程序异常退出了,但不要慌,一切尽在我的掌握之中!')

sql查询函数

由于 查 操作相对于 增删改 操作来说不需要应用,所以要单独分开来放一个函数,返回查询到的内容。

def exec_sql(sql):
    if mysql is ... or cursor is ...:
        print('请先初始化设置 setting 函数!')
        logging.error('请先初始化设置 setting 函数!')
        exit('虽然程序异常退出了,但不要慌,一切尽在我的掌握之中!')
    mysql.ping()
    cursor.execute(sql)
    res = cursor.fetchall()
    if res:
        return list(res)
    return []

sql执行函数

然后其他操作只返回是否执行成功,用以给出不同响应。

def commit_sql(sql):
    if mysql is ... or cursor is ...:
        print('请先初始化设置 setting 函数!')
        logging.error('请先初始化设置 setting 函数!')
        exit('虽然程序异常退出了,但不要慌,一切尽在我的掌握之中!')
    try:
        mysql.ping()
        cursor.execute(sql)
        mysql.commit()
        return True
    except pymysql.Error as e:
        print(f'exception: {e.args}')
        logging.exception(e.args)
        mysql.rollback()
        return False

整型字段

通过相关缺省参数,自动生成sql语句,在整型中有自增属性。

class Int:
    def __init__(self, *, max_length=11, null=False, primary=False, only=False, auto=False, default=''):
        sql = 'int'
        if max_length:
            sql += f'({max_length})'
        if null:
            sql += ' NOT NULL'
        if primary:
            sql += ' PRIMARY KEY'
        if only:
            sql += ' UNIQUE'
        if auto:
            sql += ' AUTO_INCREMENT'
        if default:
            sql += f' DEFAULT {default}'
        self.sql = sql

浮点型字段

通过相关缺省参数,自动生成sql语句。

class Float:
    def __init__(self, *, max_length=0, null=False, primary=False, only=False, default=''):
        sql = 'float'
        if max_length:
            sql += f'({max_length})'
        if null:
            sql += ' NOT NULL'
        if primary:
            sql += ' PRIMARY KEY'
        if only:
            sql += ' UNIQUE'
        if default:
            sql += f' DEFAULT {default}'
        self.sql = sql

字符串型字段

通过相关缺省参数,自动生成sql语句。

class Varchar:
    def __init__(self, *, max_length=255, null=False, primary=False, only=False, default=''):
        sql = 'varchar'
        if max_length:
            sql += f'({max_length})'
        sql += '  CHARACTER SET utf8mb4'
        if null:
            sql += ' NOT NULL'
        if primary:
            sql += ' PRIMARY KEY'
        if only:
            sql += ' UNIQUE'
        if default:
            sql += f' DEFAULT {default}'
        self.sql = sql

文本型字段

通过相关缺省参数,自动生成sql语句,文本型是在字符串长度超过 255 时的方案,有 short 、 long 等,这里就简单使用 text 类型了。

class Text:
    def __init__(self, *, max_length=0, null=False, primary=False, only=False, default=''):
        sql = 'text'
        if max_length:
            sql += f'({max_length})'
        sql += '  CHARACTER SET utf8mb4'
        if null:
            sql += ' NOT NULL'
        if primary:
            sql += ' PRIMARY KEY'
        if only:
            sql += ' UNIQUE'
        if default:
            sql += f' DEFAULT {default}'
        self.sql = sql

数据表类

这里是根据字段在初始化时自动创建数据表、根据条件自动对数据表进行简单的增删改查操作的类。

class Table:
    def __init__(self, table, **kwargs):
        sql = f'CREATE TABLE IF NOT EXISTS `{table}` (' + ', '.join([f'`{key}` {kwargs[key].sql}' for key in kwargs]) + ') DEFAULT CHARSET=utf8mb4;'
        self.fields = kwargs
        self.table = table
        self.sql = sql
        self.create()

    def field(self):
        return list(self.fields.keys())

    def record(self):
        res = self.select(fields='COUNT(*)')
        if res:
            return res[0]['COUNT(*)']
        return 0

    def create(self):
        if commit_sql(self.sql):
            return True
        else:
            return False

    def select(self, *, fields='*', where=None):
        if isinstance(fields, list):
            fields = ', '.join(fields)
        sql = f'SELECT {fields} FROM `{self.table}`'
        if where:
            sql += ' WHERE ' + ' AND '.join([f'`{key}` = "{where[key]}"' for key in where])
        sql += ';'
        return exec_sql(sql)

    def insert(self, *, fields=False, values):
        sql = f'INSERT INTO `{self.table}` '
        if fields:
            sql += '(' + ', '.join([f'`{key}`' for key in values.keys()]) + ') VALUES (' + ', '.join([f'"{value}"' for value in values.values()]) + ');'
        elif isinstance(values, dict):
            sql += 'VALUES (' + ', '.join([f'"{value}"' for value in values.values()]) + ');'
        elif isinstance(values, list):
            sql += 'VALUES (' + ', '.join([f'"{value}"' for value in values]) + ');'
        else:
            sql += 'VALUES (' + str(values) + ');'
        if commit_sql(sql):
            return True
        else:
            return False

    def update(self, *, where, values):
        sql = f'UPDATE `{self.table}` SET ' + ', '.join([f'`{key}` = "{values[key]}"' for key in values]) + ' WHERE ' + ' AND '.join([f'`{key}` = "{where[key]}"' for key in where]) + ';'
        if commit_sql(sql):
            return True
        else:
            return False

    def delete(self, *, where):
        sql = f'DELETE FROM `{self.table}` WHERE ' + ' AND '.join([f'`{key}` = "{where[key]}"' for key in where]) + ';'
        if commit_sql(sql):
            return True
        else:
            return False

实体生成类

这个类用来快速生成实体类并在初始化类时附带类型检查与正则检查,能够有效防止 sql 注入。

property函数生成函数

通常这个函数能够在赋值时进行类型检查,如果属性很多的话会写的类似,我就设计了一个生成函数,相关参数一输入,直接赋值输出的东西粘贴过去就好了。

def make_property_function(variable_list, method_list, *, indentation=1, condition=True, private='__'):
    """
    生成 property 函数( \t 不被 pycharm 所兼容,最后需要将 \t 转换成 4 个空格)
    :param variable_list: 字符串类型描述
    :param method_list: property 方法列表 ['getter', 'setter', 'deleter'] (设置 property 函数,property 本体会默认生成)
    :param indentation: 函数缩进等级,指装饰器和函数名所在行之前的缩进(每级一个 \t 长度)
    :param condition: 是否加入简易类型判断(当 variable_list 为列表时无法使用此功能)
    :param private: 私有等级 ['_', '__']
    :return: 生成的 property 函数字符串
    """
    if isinstance(variable_list, list):
        condition = False
    string = ''
    for v in variable_list:
        string += '\n\n' + '\t' * indentation + '@property'
        string += '\n' + '\t' * indentation + f'def {v}(self):'
        string += '\n' + '\t' * indentation + f'\treturn self.{private}{v}'
        builtins = ''
        if v in dir(__builtins__):
            builtins = '_'
        if 'setter' in method_list:
            string += '\n\n' + '\t' * indentation + f'@{v}.setter'
            string += '\n' + '\t' * indentation + f'def {v}(self, {builtins}{v}):'
            if condition:
                string += '\n' + '\t' * indentation + f'\tif not isinstance({builtins}{v}, {variable_list[v]}):'
                string += '\n' + '\t' * indentation + f'\t\traise ValueError("variable `{v}` must be type of `{variable_list[v]}`")'
            string += '\n' + '\t' * indentation + f'\tself.{private}{v} = {builtins}{v}'
        if 'getter' in method_list:
            string += '\n\n' + '\t' * indentation + f'@{v}.getter'
            string += '\n' + '\t' * indentation + f'def {v}(self):'
            string += '\n' + '\t' * indentation + f'\treturn self.{private}{v}'
        if 'deleter' in method_list:
            string += '\n\n' + '\t' * indentation + f'@{v}.deleter'
            string += '\n' + '\t' * indentation + f'def {v}(self):'
            string += '\n' + '\t' * indentation + f'\tdel self.{private}{v}'
    return string.replace('\t', '    ')

property函数生成函数存根生成函数

这是函数的存根生成函数,为了有逼格,我通常都会写个存根文件,不过手写的话也很累,所以设计了这个函数,可以和函数生成函数使用统一参数。

def make_property_stub(variable_list, method_list, *, indentation=1):
    """
    生成 property 函数的存根字符串
    :param variable_list: 字符串类型描述
    :param method_list: property 方法列表 ['getter', 'setter', 'deleter'] (设置 property 函数,property 本体会默认生成)
    :param indentation: 函数缩进等级,指装饰器和函数名所在行之前的缩进(每级一个 \t 长度)
    :return:
    """
    string = ''
    for v in variable_list:
        string += '\n' + '\t' * indentation + '@property'
        string += '\n' + '\t' * indentation + f'def {v}(self) -> {variable_list[v]}: ...'
        builtins = ''
        if v in dir(__builtins__):
            builtins = '_'
        if 'setter' in method_list:
            string += '\n' + '\t' * indentation + f'@{v}.setter'
            string += '\n' + '\t' * indentation + f'def {v}(self, {builtins}{v}: {variable_list[v]}) -> NoReturn: ...'
        if 'getter' in method_list:
            string += '\n' + '\t' * indentation + f'@{v}.getter'
            string += '\n' + '\t' * indentation + f'def {v}(self) -> {variable_list[v]}: ...'
        if 'deleter' in method_list:
            string += '\n' + '\t' * indentation + f'@{v}.deleter'
            string += '\n' + '\t' * indentation + f'def {v}(self) -> NoReturn: ...'
    return string.replace('\t', '    ')

生成python代码文件和python存根文件函数

这个的使用方式是: make_python_file(‘类名’, 参数类型, 必须参数, 非必须参数) 其他参数可选,往往只需更改 mysql_tools_file(数据库帮助类) 的引用地址和 property 函数所需的方法名称列表。
里面还增加了“赠改”同体的函数,在查询不到唯一键时就自动创建,否则更新数据,也可以自己修改定义,同时增加了删除函数,用的比较少。有个 make_all_???s(table) 函数能够自动读表,并将所有数据生成实体类迭代返回。


NEWLINE = '\n'  # 换行标志


def make_python_file(file_name, data_type, data_necessary, data_unnecessary, *, project_name='',
                     mysql_tools_file='MySQLController', create_file=True, property_use=True, method_list=None):
    """
    生成功能模块 .py 文件和 .pyi 存根文件
    :param file_name: 模型名称(也是文件名,不含后缀)
    :param data_type: 参数类型
    :param data_necessary: 必需要的参数
    :param data_unnecessary: 非必需参数
    :param project_name: 项目名称
    :param mysql_tools_file: 数据库工具类相对路径(例如:ToolsCreator.MySQLController)[.代表当前目录..代表上层目录]
    :param create_file: 是否自动创建文件
    生成 property 函数
    :param property_use: 是否创建 property 函数
    :param method_list: property 方法列表 ['getter', 'setter', 'deleter'] (设置 property 函数,property 本体会默认生成)
    :return: (.py 文件内容, .pyi 文件内容)
    """
    string = ''
    string2 = ''
    assert set(data_type.values()) | {int, float, str} == {int, float, str}, ValueError('当前版本只支持 int、float、str 三种类型!')
    if not method_list:
        method_list = []
    if property_use:
        variable_list = {parameter: data_type[parameter].__name__ for parameter in data_type}
        string = make_property_function(variable_list, method_list)
        string2 = make_property_stub(variable_list, method_list)

    file_py = f"""
# _*_ coding:utf-8 _*_
# Project: {project_name}
# FileName: {file_name.lower()}.py
# ComputerUser:19305
# Day: {time.strftime('%Y/%m/%d', time.localtime(time.time()))}
# Time: {time.strftime('%H:%M', time.localtime(time.time()))}
# IDE: PyCharm
# 2022年,所有bug都将会被丢到海里喂鲨鱼!我说的!不容反驳!

import re
from {mysql_tools_file} import setting, Table, Int, Float, Varchar

{file_name.upper()}_TYPE = {{{', '.join(f'{parameter!r}: {data_type[parameter].__name__}' for parameter in data_type)}}}
{file_name.upper()}_NECESSARY = {data_necessary!r}
{file_name.upper()}_UNNECESSARY = {data_unnecessary!r}
{file_name.upper()}_RE_TYPE = {{
{f',{NEWLINE}'.join(f"    {parameter!r}: re.compile(R'.*')" for parameter in data_type)}
}}
{file_name.upper()}_FIELD_TYPE = {{
    'id': Int(null=True, primary=True, auto=True),  # 自动递增id
{f',{NEWLINE}'.join(f'    {parameter!r}: {(data_type[parameter] == int and "Int(null=True)") or (data_type[parameter] == float and "Float(null=True)") or "Varchar(null=True)"}' for parameter in data_necessary)}{',' if data_unnecessary else ''}
{f',{NEWLINE}'.join(f'    {parameter!r}: {(data_type[parameter] == int and "Int(null=False)") or (data_type[parameter] == float and "Float(null=False)") or "Varchar(null=False)"}' for parameter in data_unnecessary)}{NEWLINE if data_unnecessary else ''}}}


def check(function):
    def type_check(self, **kwargs):
        if kwargs.get('id'):
            self._{file_name.title()}__id = kwargs.get('id')
            del kwargs['id']
        for n, attributes in enumerate(zip(list(kwargs.keys()), tuple(kwargs.values()))):
            if {file_name.upper()}_TYPE.get(attributes[0], str) == float and isinstance(attributes[1], int):
                if kwargs.get(attributes[0], None):
                    kwargs[attributes[0]] = float(kwargs[attributes[0]])
            elif {file_name.upper()}_TYPE.get(attributes[0], str) == str:
                kwargs[attributes[0]] = str(kwargs[attributes[0]])
            elif not isinstance(attributes[1], {file_name.upper()}_TYPE.get(attributes[0], str)):
                raise ValueError(f'Variable `{{attributes[0]}}` must be type of `{{{file_name.upper()}_TYPE.get(attributes[0], str)}}`')
            elif not {file_name.upper()}_RE_TYPE.get(attributes[0], re.compile('.*?')).fullmatch(str(attributes[1])):
                raise ValueError(f'Variable `{{attributes[0]}}`="{{attributes[1]}}" is not a correct value`')
        return function(self, **kwargs)
    return type_check


class {file_name.title()}:
    @check
    def __init__(self, *, {', '.join(data_necessary)}{''.join(f', {parameter}=None' for parameter in data_unnecessary)}):
{NEWLINE.join(f'        self.__{parameter} = {parameter}' for parameter in data_type)}

    def commit(self, table):  # 插入或更新数据
        if table.select(fields='{data_necessary[0]}', where=dict({data_necessary[0]}=self.__{data_necessary[0]})):
            return table.update(where=dict({data_necessary[0]}=self.__{data_necessary[0]}), values={{key: self.__dict__.get(f'_{file_name.title()}__{{key}}') for key in {file_name.upper()}_NECESSARY + {file_name.upper()}_UNNECESSARY if self.__dict__.get(f'_{file_name.title()}__{{key}}')}})
        else:
            return table.insert(fields=True, values={{key: self.__dict__.get(f'_{file_name.title()}__{{key}}') for key in {file_name.upper()}_NECESSARY + {file_name.upper()}_UNNECESSARY if self.__dict__.get(f'_{file_name.title()}__{{key}}')}})

    def delete(self, table):  # 删除数据
        if table.select(fields='{data_necessary[0]}', where=dict({data_necessary[0]}=self.__{data_necessary[0]})):
            return table.delete(where=dict({data_necessary[0]}=self.__{data_necessary[0]}))
        return False{string}


def make_all_{file_name.lower()}s(table):
    def format_data(data):
        data = {{key: {file_name.upper()}_TYPE[key](data[key]) if key != 'id' else int(data[key]) for key in data if data[key]}}  # 改变当键为id时的处理方式
        return data
    for {file_name.lower()} in table.select():
        yield {file_name.title()}(**format_data({file_name.lower()}))


if __name__ == '__main__':
    setting()
    {file_name.lower()}s = Table('{file_name.lower()}s', **{file_name.upper()}_FIELD_TYPE)
""".lstrip('\n')

    file_byi = f"""
from re import Pattern
from types import FunctionType
from {mysql_tools_file} import Int, Float, Varchar, Table
from typing import Iterator, Dict, List, Callable, NoReturn
{file_name.upper()}_TYPE: Dict[str, Callable] = ...  # 参数类型
{file_name.upper()}_NECESSARY: List[str] = ...  # 必需要的参数
{file_name.upper()}_UNNECESSARY: List[str] = ...  # 非必需参数
{file_name.upper()}_RE_TYPE: Dict[str, Pattern] = ...  # 参数字符串正则检验
{file_name.upper()}_FIELD_TYPE: Dict[str, Int | Float | Varchar] = ...  # 参数数据库字段对应
def check(function) -> FunctionType:  # 检查函数装饰器
    def type_check(self: Callable = ..., **kwargs: Dict[str, int | float | str]) -> NoReturn | ValueError: ...  # 检查各参数是否符合类型
class {file_name.title()}:
    def __init__(self, *,
{f',{NEWLINE}'.join(f'                 {parameter}: {data_type[parameter].__name__}' for parameter in data_necessary)}{',' if data_unnecessary else ''}
{f',{NEWLINE}'.join(f'                 {parameter}: {data_type[parameter].__name__} = ...' for parameter in data_unnecessary)}
                 ) -> NoReturn:
{NEWLINE.join(f'        self.__{parameter}: {data_type[parameter].__name__} = ...' for parameter in data_type)}
    def commit(self, table: Table) -> bool: ...
    def delete(self, table: Table) -> bool: ...{string2}
def make_all_{file_name.lower()}s(table: Table) -> Iterator[{file_name.title()}]:  # 生成所有对象
    def format_data(data: [str, int | float | str]) -> Dict[str, int | float | str]: ...  # 格式化数据
""".strip('\n')

    if create_file:
        open(f'{file_name.lower()}.py', 'w', encoding='utf-8').write(file_py)
        open(f'{file_name.lower()}.pyi', 'w', encoding='utf-8').write(file_byi)
    return file_py, file_byi

结束语

这就是我这工具类的全部内容了,如果喜欢的话可以一键三连~~

使用Python茅台抢购脚本的使用说明 京东抢购流程 本文我介绍两种不同的方法方法二适合小白学习 文章有点长请耐心看完 方法一 简单明了的流程图 首先来说说京东的吧。 画个简单的流程图: null和90008 在流程图中,充分展示了为什么有的人会返回null,有的人会是90008,有的是90016。当然,这是我的猜测,具体情况如何,还得问京东的开发人员。 虽然这样的抢购挺不公平的。但是对于京东来说,或者说对于服务器压力,还是其他资本原因来说,都是一个很不错的选择。 为啥这么说。 服务器压力部分 首先说一下压力的原因。大 阅读详情

相关推荐

第十章 Python编程基础——Python 学习资源与进阶方向

Python 的创始人 Guido van Rossum 曾说:“Python 的目标是让复杂的事情变得简单”。编程不是短跑,而是一场马拉松。保持热爱,持续学习,你一定能成为 Python 高手!

m0_49633491的博客 3003

对脚本的认识

1、脚本的大体认识;脚本script是使用一种特定的描述性语言,依据一定的格式编写的可执行文件,又称作宏或批处理文件。脚本通常可以由应用程序临时调用并执行。各类脚本目前被广泛地应用于网页设计中,因为脚本不仅可以减小网页的规模和提高网页浏览速度,而且可以丰富网页的表现,如动画、声音等。举个最常见的例子,当我们点击网页上的E-mail地址时能自动调用Outlook Express或Foxmail这类邮

water1730的博客 490

如何学习abaqus的python脚本

Abaqus作为一款在业界享有盛誉的多物理场有限元分析软件,在结构力学、流体动力学、热传导以及电磁学等多个领域都拥有强大的模拟分析能力。对于从事CAE仿真工作的工程师们而言,掌握Abaqus是提高工作效率与仿真精度的关键技能之一。然而,仅仅掌握软件界面操作是远远不够的,要想在复杂工程问题求解中更加游刃有余,学会使用Python脚本编写Abaqus自动化脚本才是王道。

xiamu_CDA的博客 1759

STM32F103_TIM3输出PWM波实现全彩呼吸灯

一、LED灯 1.必须是全彩RGB_LED灯 2. 通过不同的红绿蓝三色LED混合出256种颜色,同电脑画图里的调色RGB888,每个灯各用8位控制其亮度,其中全灭表示黑色。 二、 1. LED亮度等级表 /* LED亮度等级 PWM表,指数曲线 ,此表使用工程目录下的python脚本index_wave.py生成*/ const uint16_t indexWave[] = { ...

InWho的博客 1万+

【Python】脚本

要真正理解Python,我们不能仅仅停留在其语法层面。我们需要深入其核心,了解它为何被设计成现在这样,其背后的设计哲学如何影响了我们今天所见的语言特性。Python并非一夜之间出现,它是由Guido van Rossum在1980年代末期构思,并于1991年首次发布。然而,更重要的是其指导思想,这些思想凝结在著名的“Python之禅”(The Zen of Python)中。1.1.1 Python之禅:指导思想的深远影响“Python之禅”是一组指导Python语言设计和开发的原则。它不仅仅是一些口号,更

宅男很神经 1217

Python与自动化脚本编写

Python与自动化脚本编写

4.0啊的博客 2140

Python的主要用途是什么

Python的主要用途是什么

隔壁王叔的博客 995

Python脚本是什么?

这个简单的示例展示了Python脚本的基本结构和语法。你可以根据自己的需求编写更复杂的脚本,利用Python强大的功能和库来实现各种任务和项目。Python脚本是使用Python编程语言编写的一系列指令和命令的集合。Python脚本的优势之一是它的简洁性和可读性。Python语言设计的初衷是提供一种易于理解和编写的语法,使得开发人员能够快速地实现想法。此外,Python拥有丰富的标准库和第三方库,可以轻松地扩展脚本的功能。,然后使用加法运算符计算它们的和,并将结果存储在变量。为扩展名的文件中,比如。

2301_78484069的博客 939

如何使用Python脚本

如何使用Python脚本

Java癫疯的博客 1万+

〖Python零基础入门篇⑦〗- Python 的脚本结构

在 Pycharm 中,我们有两种方式执行脚本。 一种是利用菜单栏、工具栏、右击出现的 "run xxxx"(或者快捷键 Ctrl + Shift + F10) 实现。 另一种就是利用 Pycharm 的 Terminal 命令行终端

易编橙 · 终身成长社群,相遇已是上上签! 4万+

〖Python语法进阶篇①〗- 进程与多进程概述

大家好啊,我胡汉三又回来了。 [Python零基础入门篇] 已经结束,接下来我们即将开始 [Python语法进阶篇]。该阶段我们主要围绕 多线程编程、正则表达式、以及我们将会有一个贴近实战的 抽奖项目练习 。接下来我们就要开始学习 多进程与多线程 了,关于这一块的知识点,其实是有一点的难度的,不过我会尽量使用简单的入门浅显的方法去阐述这部分内容。 接下来我们就要开始学习 `多进程与多线程` 了,

易编橙 · 终身成长社群,相遇已是上上签! 4万+

python脚本“文档”撰写——“诱骗”ai撰写“火火的动态”python“自动”脚本文档

此Python脚本是一个自动化工具,用于根据存储在磁盘文本中的“人气blink动态”数据记录,按阅读量排序后生成优快云博文笔记的页面源码。脚本支持MarkDown语法和HTML5标记语法的混合使用,能够自动格式化打印输出优快云动态blink的URL列表,并从磁盘读取本工程的Python脚本源码文本,以便在笔记页面中分享。生成的页面源码被写入一个磁盘文本,方便用户手动复制更新优快云学习笔记内容。

m0_57158496的博客 1374

Android wifi源码分析(二) Wifi关闭流程

接着上一篇,这篇说一下Wifi的关闭流程。 由上一篇可以知道,framework层提供的wifi开关接口都是**setWifiEnabled**,只是参数不同而已。*true*表示开启wifi、*false*表示关闭wifi。

奋斗的菜鸟ing 3300

Python解释器、REPL与脚本的区别

Python解释器、REPL与脚本的区别——理解运行机制的本质,掌控编程的灵魂

测试者家园 1423

接口操作MySQL跟MongoDB事务回滚问题

通常使用的事务注解:@Transactional 是不会对MongoDB生效的,但是在一些生产接口中无法避免同时使用MySQL跟MongoDB的操作。

weixin_45932023的博客 1579

Stable Diffusion跑图总爆显存?别急着换显卡,试试这个PYTORCH_CUDA_ALLOC_CONF参数调优

本文深入解析了Stable Diffusion运行中常见的显存不足问题,特别是由显存碎片化导致的假性OOM现象。通过详细讲解PYTORCH_CUDA_ALLOC_CONF参数中的max_split_size_mb设置技巧,提供了一套完整的显存优化方案,帮助用户在无需升级硬件的情况下显著提升AI绘画的稳定性与效率。

weixin_42524100的博客 347

用 uv 来运行 Python 脚本

就包含运行它所需要的所有信息(如依赖包、Python 版本)。它抽象掉了虚拟环境的底层细节,让开发者更专注于代码逻辑本身。将 Python 脚本从一个单纯的“代码文件”提升为了一个“规范,将依赖直接写在 Python 脚本的注释里。这个过程是原子化的,极大地简化了工作流。提供了命令来帮你管理这个元数据块。它推崇一种声明式的方法:让脚本文件。参数,适合一次性运行或测试。会自动读取这个块并安装依赖。在脚本运行方面的本质是。的顶部生成或更新一个。

acccc1122的博客 1796

【网络协议】TCP的拥塞控制机制

前言 计算机网络中的带宽、交换节点中的缓存和处理机等,都是网络的资源,在某段时间内,若对网络中某一资源的需求超过了该资源所能提供的可用部分,网络的性能就要变坏,这种情况就叫做拥塞。 所谓拥塞控制,就是防止过多的数据注入到网络中,从而使网络中的路由器或链路不致过载。要注意用拥塞控制与流量控制的区别,拥塞控制是一个全局性的过程,涉及到所有的额主机、路由器,以及与降低网 拥塞控制的算法有:慢开始、拥塞避免、快重传、快恢复四种。 慢开始和拥塞避免 发送方维持一个拥塞窗口的状态变量,其大小取决于网络的拥塞程度

兰亭风雨的专栏 1万+

Mac端 Python脚本创建与理解

如果我们在执行python脚本时需要为某些变量赋值&传入文件,我们首先需要在脚本里导入argparse库,并调用该库的' .ArgumentParser() '方法,创建一个参数解析器对象。而当该文件作为模块导入到另一个 Python 脚本中时,' __name__ ' 会变成该文件的文件名,此时if判断为False,不执行主函数,故该文件仅作库被其他文件导入后调用方法。文件时,通常会在其中导入特定的 Python 库,并调用其提供的方法。理解上述参数介绍并配置好脚本,接下来我们尝试运行。

wrz427的博客 715

计算机视觉之ResNet

RestNet是2015年由微软团队提出的,在当时获得分类任务,目标检测,图像分割第一名。该论文的四位作者何恺明、张祥雨、任少卿和孙剑如今在人工智能领域里都是响当当的名字,当时他们都是微软亚研的一员。实验结果显示,残差网络更容易优化,并且加深网络层数有助于提高正确率。在ImageNet上使用152层的残差网络(VGG net的8倍深度,但残差网络复杂度更低)。对这些网络使用集成方法实现了3.75%的错误率。获得了ILSVRC 2015竞赛的第一名。原文链接这是一篇计算机视觉领域的经典论文。

十年以上架构设计经验,专注于软件架构和人工智能领域,对机器视觉、NLP、音视频等领域都有涉猎 2万+

OSG第三方库编译之二十一:minizip编译(Windows、Linux、Macos环境下编译)

OSG编译;第三方库;跨平台编译;minizip编译(Windows、Linux、Macos环境下编译)

LuckyHanMo的博客 2624

Python高手必读的3本书——Python进阶三剑客

Python 的语法简单、易于学习,即使没有编程背景的人,也可以在较短时间内掌握 Python 的基础知识,用于编写简单的自动化脚本、数据处理和分析。目前,Python 已经成为世界范围内最受欢迎的编程语言。入门 Python 简单,精通 Python 难,在这一波大模型技术背景下,精通 Python 已经势在必行。

m0_62283350的博客 1023

BMS控制板硬件设计核心要点与工程避坑指南

电池管理系统(BMS)硬件设计是保障锂电安全与寿命的关键环节,其本质是模拟前端精度、数字控制可靠性、电源完整性及电磁兼容性四大要素的系统协同。理解AFE芯片(如BQ76920)的物理层约束、MCU与专用监控IC的异构分工逻辑,是构建高鲁棒BMS的基础;而晶振布局、I²C总线匹配、MOSFET体二极管方向、开尔文采样等细节,直接决定量产良率与EMC合规性。在电动工具、储能系统、两轮电动车等中低功耗BMS应用中,成本敏感型方案常采用STM32F0+AFE架构,此时电源滤波电容选型、复位电路ESR控制、TVS/齐

weixin_30591519的博客 262

python进阶教程

以上仅为Python进阶教程的一个概览,每个部分都可以进一步细化和扩展。希望这个框架能为你提供一个清晰的学习路径,并帮助你深入掌握Python的高级特性和应用。记得在学习过程中多动手实践,通过编写代码来巩固所学知识。

daoliuweisong12的博客 2325

jre9下载 jdk9

(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

python数据结构推荐书-「算法与数据结构」从入门到进阶吐血整理推荐书单

推荐一下「算法与数据结构」从入门到进阶的书单。一.入门系列这些书籍通过图片、打比方等通俗易懂的方法来讲述,让你能达到懂一些基础算法,线性表,堆栈,队列,树,图,DP算法,背包问题等,不要求会实现,但是看过以下这些书对于之后实现算法打下坚实的思维基础。很适合在闲暇之余拿出来阅读一番。1.1 《啊哈!算法》image这不过是一本有趣的算法书而已。和别的算法书比较,如果硬要说它有什么特点的话,那就是你能...

weixin_37988176的博客 1412

C# WinForm 基于DirectShow.dll编写的程序,可边预览边保存视频,音频和图片

基于微软的DirectShow.dll的二次开发1.自动识别连接的摄像头跟麦克风且可以对其进行选择(默认选中第一个)2.可录制wmv和avi两种格式的视频并且都带有音频,avi可以录制的分辨率和帧数进行选择,wmv默认进行了淸晰度优化如不喜欢可去除代码中有相关提示3.可在预览点开之后进行拍照,也可边录制视频边拍照4.添加了视频和音频的压缩功能(酌情使用)这次二次开发发现C#对DirectShow的相关信息太少,这次做完也不敢藏私共享出来,还望大家指正

上一篇: 十大排序算法整理(含JavaScript版本与Python版本源码)
下一篇: 史上最最最没用程序——自写平衡化学方程式
user_from_future
博客等级 码龄5年 4067粉丝 115原创
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值