当前位置: 首页 > news >正文

Python 函数(lambda 匿名函数、自定义函数、装饰器)基本使用指南

Python 函数

函数是组织好的,可重复使用的,用来实现单一,或相关联功能的代码段

lambda 匿名函数

对于单行函数,使用 lambda 表达式可以省去定义函数的过程,让代码更加简洁;

对于不需要多次复用的函数,使用lambda 表达式可以在用完之后立即释放,提高程序执行的性能。

格式:

  • 一般形式

    lambda arguments: expression# 示例:
    add_lambda = lambda a, b: a + b
    print(add_lambda(10, 20))		# 输出:30# 不将 lambda 函数分配给变量,直接使用
    result = (lambda x: x * 2)(3)
    print(result)  					# 输出 6
    
  • 含 if 判断的形式

    lambda arguments: value_if_true if condition else value_if_false# 示例:
    a = lambda x : "偶数" if x % 2 == 0 else "奇数"
    print(a(10))		# 输出:偶数
    

lambda 函数与 def 函数的区别:

  • lambda 可以立刻传递(无需变量) ,自动返回结果
  • lambda 在内部只能包含一行代码
  • lambda 是一个为编写简单的函数而设计的,而 def 用来处理更大的任务
  • lambda 可以定义一个匿名函数,而 def 定义的函数必须有一个名字

自定义函数

语法

  • 基本语法:

    def functionName(param1, param2, ..., paramN):# function_suitereturn [expression]
    
    • def :关键字,定义函数的声明

    • functionName :自定义函数名称

    • (param1, param2, … , paramN) :定义入参

      • Python中,根据实际参数的类型不同,函数参数的传递方式可分为按值传递和按引用传递

        • 按值传递:适用于字符串、数字、元组

          按值传递的参数值在函数代码中发生改变,函数外面的变量值并不会受到任何影响

        • 按引用传递:适用于列表,字典、集合

          按引用传递的参数值在函数中的值改变了,函数外部的值也改变

      • 可以为参数设定一个默认的值,调用函数时如果没有传参,则使用默认值,而如果传参了,则会覆盖默认值

        默认参数通常放置在参数列表的末尾,以便在函数调用时更灵活。如果将默认参数放在非默认参数之前,则在函数调用时必须使用参数名称传参。

        def my_sum(num1, num2=1):return num1 + num2
        
      • 参数名称前面可以加一个星号:表示它会将传递进来的(一个或多个)值转为元组类型

        def my_def(*str):print(str)my_def("a")			# 输出:('a',)
        my_def("a", "b")	# 输出:('a','b')
        
      • 参数名称前面可以加两个星号:表示该参数需要接收字典类型的数据,即传参时需要用等号赋值的形式

        def my_def(**str):print(str)my_def(a=1)			# 输出:{'a': 1}
        my_def(a=1, b=2)	# 输出:{'a': 1, 'b': 2}
        
      • 配置 * 作为函数的一个形参:Python 不会对该 * 做任何事情,但是它将知道之后的所有参数都应作为关键字参数(键值对,也被称为 kwargs)来调用。即使它们没有默认值。

    • function_suite :函数的逻辑处理代码块

    • return [expression] :结束函数,并选择性地返回一个或多个值给调用方

      函数返回值可以是各种数值,字符,类,函数等对象,返回多个值时会被打包为一个元组

      如果函数没有显式指定返回值,则默认返回None,表示空值。None是一个特殊的Python对象,表示缺失或无效的值。

      没有返回值时,return 可省略

  • 注:

    • 函数内容以冒号起始,并且缩进

    • 函数的第一行语句可以选择性地使用文档字符串(用于存放函数说明)

    • 主程序调用函数时,如果函数没有在之前定义,那就会报出错误

      但如果是在函数中去调用函数,那函数定义的先后就不受影响

    • 调用函数传参时,可以通过位置和参数名称两种方法传参

      def person_info(name, age):print(f"Name: {name}")print(f"Age: {age}")# 位置传参
      person_info(25, "Alice")
      # 参数名称传参
      person_info(age=25, name="Alice")
      
    • 返回多个值的解包:

      在函数调用时,可以使用多个变量来接收函数返回的多个值。这被称为解包,可以通过位置或变量名来解包返回的值。

      def calculate(x, y):sum = x + ydifference = x - yreturn sum, differenceresult_sum, result_diff = calculate(8, 3)
      print(result_sum)  	# 输出: 11
      print(result_diff)  # 输出: 5
      
    • 由于 python 是不需要编译的,所以其函数 def 是可执行的一条语句,也就意味着直到函数被调用前,这个函数都不存在,直到函数被调用时,def 语句才会创建一个新的函数对象,并赋予名字


函数嵌套

  • python 函数还有一大特性就是支持函数的嵌套。所谓的函数嵌套,就是函数里面又有函数

    def f1():print('hello')def f2():print('python')f2()
    f1()
    
  • 函数嵌套可以保证内部函数的隐私。

    内部函数只能被外部函数所调用和访问,不会暴露在全局作用域,因此,如果函数内部有一些隐私数据,不想暴露在外,那就可以使用函数的嵌套,将其封装在内部函数中,只通过外部函数来访问。其另一个作用就是可以简化代码。


函数变量作用域

  • python 函数中变量的作用域和其他语言类似,分为全局变量和局部变量

    • 全局变量:函数外定义的变量,程序任意位置都可以访问
    • 局部变量:函数内定义的变量
  • 在 python 中不能直接在函数内部随意改变全局变量的值(直接修改会报错)

    如果需要修改在函数中修改全局变量的值,需要先在函数内使用 global 关键字声明该变量是全局变量

    a = 10
    def myPrint():global aa = a + 1myPrint()
    print(a)	# 输出:11
    
  • 如果函数内与函数外定义了同名变量,则函数内部就是函数内部定义的值,函数外则是函数外定义的值

  • 映射至函数嵌套。如果内部函数要修改外部函数的值,需要先在内部函数内使用 nonlocal 关键字声明一下

    def myPrint():a = 10def myPrintIn():nonlocal aa = a + 1myPrintIn()print(a)myPrint()	# 输出:11
    

闭包

  • 和嵌套函数类似,不同的是外部函数返回的是一个函数,而不是一个具体的值。

    当一个内部函数引用了外部函数的变量,并且在外部函数执行完毕之后仍然存在,这个内部函数就被认为是一个闭包。

  • 闭包的主要优点是:

    • 可以保护隐藏在外部函数作用域中的数据,使其不能被意外修改。
    • 可以为外部函数提供一种延续性,即使外部函数已经执行完毕,闭包仍然可以访问和使用外部函数的变量。
    • 可以允许在多个函数调用之间共享数据。
    • 可以使代码更加简洁。
  • 闭包一般与装饰器一起使用!

  • 示例:

    # 定义闭包函数
    def color_print(color):def print_with_color(text):print(f"\033[{color}m{text}\033[0m")return print_with_color		# 返回内部函数,形成闭包# 调用闭包函数并赋值变量(创建不同的颜色打印函数)
    red_print = color_print("31")  		# 红色
    green_print = color_print("32")  	# 绿色# 调用颜色打印函数
    red_print("Hello, World!")
    green_print("Hello, World!")
    

装饰器

  • 装饰器是 Python 中一种强大而有用的编程工具,它允许修改、扩展或包装函数或方法的行为,而无需修改其原始代码。

    装饰器通常用于代码重用、修改函数的行为、日志记录、权限检查、性能测量等方面。

  • 在 Python 中,装饰器本质上是一个函数,它接受一个函数作为参数,并返回一个新的函数。这个新函数通常会在调用被装饰的函数之前或之后执行一些额外的操作,实现将额外的功能添加到原始函数上。

    装饰器通过在被装饰的函数定义之前使用 @ 符号来应用。

  • 基本语法:

    from functools import wraps# 定义装饰器
    def my_decorator(func):# 定义装饰器的内部函数@wraps(func)def wrapper(*args, **kwargs):# 执行原始函数之前的操作result = func(*args, **kwargs)	 # 执行原始函数并获取返回值# 执行原始函数之后的操作return resultreturn wrapper
    
    • functools 模块中的 @wraps 装饰器:是一个用于创建装饰器的实用工具。它通常与自定义装饰器一起使用,以确保被装饰的函数保留原始函数的元数据(如函数名、文档字符串、参数列表等)。

      当创建一个装饰器时,通常会包装或修改原始函数,这可能会导致原始函数的元数据丢失。使用 @wraps 装饰器可以解决这个问题,它会将包装函数的元数据设置为与原始函数相同。

      @wraps 装饰器非必需,但推荐使用,比如使用自定义装饰器装饰使用 fastapi 框架定义的路由函数时,不加会报错(解析参数失败)!

    • 装饰器的内部函数 wrapper 的参数列表通常使用 *args**kwargs,以便能够接收任意数量和类型的位置参数和名称参数,并将它们传递给原始函数。

    • func(*args, **kwargs):调用原始函数并获取其返回值。

    • 在装饰器的返回语句中,通常是返回 wrapper 函数,注意:是返回 wrapper,不是返回 wrapper()

    • 在装饰器中传递参数:可以在装饰器函数外部包装一个额外的函数,该额外函数接受参数并返回装饰器函数。

      这样,就可以通过调用包装函数来为装饰器传递参数。

  • 示例:

    import datetime# 定义装饰器外部包装函数
    def timestamp_decorator(arg1, arg2):# 定义装饰器def decorator(func):# 定义装饰器的内部函数@wraps(func)def wrapper(*args, **kwargs):# 获取当前时间timestamp = datetime.datetime.now()# 格式化时间戳formatted_timestamp = timestamp.strftime("%Y-%m-%d %H:%M:%S")# 打印时间戳并调用原函数print("[{}]".format(formatted_timestamp), end=" ")return func(*args, **kwargs)return wrapperreturn decorator# 应用装饰器
    @timestamp_decorator(arg1='', arg2='')
    def print_with_timestamp(str):print(str)# 调用函数
    print_with_timestamp("Hello, World!")	# 输出:[2023-07-16 02:04:59] Hello, World!
    

为自定义函数写数据类型注解

  • 语法示例

    from typing import List# 示例函数,接受一个整数列表作为输入,并返回一个整数值。
    def fun(questions: List[int]) -> int:# 函数体return 1
    
    • questions :传进去的参数

      :List[int] :表明传入的 questions 类型是整数列表

    • -> int :表明函数的返回值是 int 类型

    注意::List[int]-> int 都只起到提示作用,并不会改变传入值返回值的类型和值。

  • 优点:

    • 类型注解:

      通过在函数定义的参数和返回值上进行类型注解,明确指定了函数的输入和输出类型,这样其他开发人员在使用和阅读代码时更容易理解函数的预期行为和使用方式。

    • 错误预防:

      类型注解可以帮助开发人员在编写代码时捕获潜在的类型错误。如果无意中将其他类型的数据传递给函数,或者函数返回了错误的类型,类型检查器可以在开发阶段或静态分析阶段发现问题,避免了在运行时出现潜在错误。

    • 文档说明:

      类型注解可以作为代码文档的一部分,帮助其他开发人员了解函数的预期输入和输出。它可以增加代码的可读性,让其他人更容易理解函数的目的和返回值的含义。


常用装饰器

装饰器是 Python 中一种强大的编程工具,它允许在不修改函数本身的情况下,添加、修改或扩展函数的行为。

常用的 Python 装饰器:

  • @staticmethod 和 @classmethod : 用于将方法标记为静态方法和类方法。

  • @abstractmethod : 用于定义抽象基类和抽象方法,确保子类实现了这些方法

    from abc import abstractmethod
    class Person:@staticmethoddef static_method():pass@classmethoddef class_method(cls):pass@abstractmethoddef abstract_method(cls):pass
    
  • @dataclass :用于自动为类生成特殊的方法和默认的特殊方法,以简化数据类的创建和管理。

    @dataclass 可以用来装饰包含属性的类,它会自动生成一些通常需要手动编写的方法,如 __init__()__repr__()__eq__() 等,从而减少了代码的重复和冗余。

    它引入自 Python 3.7,并在 Python 3.8 中得到了增强(如字段类型注解、默认值、默认值工厂函数等)

    from dataclasses import dataclass
    @dataclass
    class Point:x: inty: int
    
  • @property 和 @<attribute_name>.setter : 用于创建属性(getter)和设置属性(setter)方法,其中 <attribute_name> 应该替换为实际的属性名称。通常用于访问和修改私有实例属性

    注:私有实例属性名称以一个下划线 _ 开头,这是一种约定,用于指示这是一个受保护的属性,不应该直接访问。

    通过属性的 getter 和 setter 方法来访问和修改属性值是一种良好的习惯,因为可以在属性访问过程中添加额外的逻辑或验证。

    from abc import abstractmethodclass Person:def __init__(self, name):self._name = name@propertydef name(self):return self._name@name.setterdef name(self, value):self._name = valueperson = Person("b")
    person.name = "a"
    print(person.name)		# 输出:a
    
  • @wraps : 用于保留原始函数的元数据(例如文档字符串、函数名等),通常在自定义装饰器中使用。


常用内置函数

open():打开并操作文件

  • open() 函数是 Python 内置的文件操作函数,用于打开文件以进行读取、写入或追加操作。

    通常和 with 语句一起使用,在文件操作完成后,文件会被自动关闭,不需要显式调用 file.close()。这是一种良好的习惯,可以避免资源泄漏问题。

  • 语法如下:

    open(file, mode='r', buffering=-1, encoding=None, errors=None, newline=None, closefd=True, opener=None)
    
    • file :要打开的文件的路径

    • mode :打开文件的操作模式

      选项有:

      • ‘r’ :只读模式(打开文件以进行读取),默认。如果文件不存在,则引发 FileNotFoundError

      • ‘w’ :写入模式(打开文件以进行写入)。如果文件存在,则会覆盖已有内容;如果文件不存在,则创建文件

      • ‘a’ :追加模式(打开文件以进行写入)。如果文件存在,将在文件末尾追加数据;如果不存在,则创建文件

      • ‘x’ :独占创建模式(打开文件以供写入)。如果文件已存在,会引发 FileExistsError。用于确保在创建文件时不会覆盖现有文件。

      • ‘t’:文本模式,默认。与上述模式组合(例如 ‘rt’、‘wt’),用于处理文本文件

      • ‘b’ :二进制模式。与上述模式组合(例如 ‘rb’、‘wb’),用于处理二进制文件,如图像、音频或视频文件

      • **‘+’ **:读写模式与上述模式组合,用于同时读取和写入文件

        • ‘r+’:读写模式,打开文件以供读取和写入。如果文件不存在,会引发 FileNotFoundError
        • ‘w+’:写入和读取模式,打开文件以供读取和写入。如果文件不存在,会创建一个新文件,如果文件存在,会覆盖已有内容
        • ‘a+’:追加和读取模式,打开文件以供读取和写入。如果文件不存在,会创建一个新文件。如果文件存在,写入的内容会追加到文件末尾,而不会清空文件。
      • ‘U’ :通用换行模式,打开文件以供读取。自动识别不同平台的换行符(\n\r\r\n

        Python 3 不建议使用

      注意,不同模式的组合可能会导致不同的文件操作行为,因此在选择模式时要特别小心,以确保符合预期

    • buffering :控制文件的缓冲方式,通常可以忽略,-1 表示使用系统默认的缓冲大小

    • encoding :用于指定文本文件的编码方式,通常在文本模式下使用。例如:encoding='utf-8'

    • errors :指定编码错误的处理方式

    • newline :控制换行符的处理方式,在文本模式下使用

    • closefd :指定是否在关闭文件时同时关闭文件描述符,默认为 True。在某些情况下,可能需要将其设置为 False

    • opener :自定义文件打开器,通常不需要使用

  • open() 返回的文件对象是一个 Python 内置的文件流,它提供了多种方法来进行文件操作,包括读取、写入、定位文件指针等。

    以下是一些常用的文件对象方法:

    • read(size=-1) : 从文件中读取指定数量的字符或字节。如果未指定大小或大小为负数,则会读取整个文件

    • readline(size=-1) : 从文件中读取一行内容。如果指定 size,则读取指定数量的字符或字节

    • readlines(hint=-1) : 从文件中读取多行内容,并将其以列表形式返回。

      每一行都作为列表中的一个元素,保留了行尾的换行符(\n),换行符可以使用 strip() 函数进行处理。

      注意,它会将整个文件内容加载到内存中,所以对于非常大的文件可能会导致内存占用问题。如果处理大型文件,可能需要逐行读取文件而不是一次性读取所有行。

      hint 参数:

      • hint 参数应该作为位置参数传递,使用关键字参数传递会报错!

      • 指定 hint=0 或 hint=-1:用于读取所有行(直到结束符 EOF)并返回列表

      • 指定 hint 的值大于0:

        • 对于文本数据:字符数量以 UNICODE 编码字符集的字符为单位计算。

          支持多字节的字符,如中文一个汉字表示1字符,空格算一个字符。

          对于文本文件,换行符是否计入字符,有如下两种情况:

          • 指定字符数中间包含 \n,则 \n 算做字符
          • 如果 \n 在指定内容末尾,则不计入字符,算作换行符
        • 在二进制模式下,字符数量是以 ASCII 码对应的单字节为单位来计算的,不剔除换行符,字符 ‘\n’ 占用一个字节长度;

        • 如果 hint 的值 大于前 n 行的总字数但小于前 n+1 行的总字数,则执行函数会读取文件的前 n+1 行

    • write(string) :将字符串写入文件。这个方法在文件以写入模式 ‘w’、‘a’、‘x’ 或 ‘w+’ 打开时可用

    • writelines(lines) : 将字符串列表写入文件,通常用于写入多行文本

    • seek(offset, whence=0) : 将文件指针移动到指定位置

      offset 是相对于 whence 参数的偏移量

      • whence 值为 0(默认),表示从文件开头计算偏移量
      • whence 值为 1,表示从当前位置计算偏移量
      • whence 值为 2,表示从文件末尾计算偏移量
    • tell() :返回当前文件指针的位置,以字节为单位

    • flush() : 将缓冲区的数据刷新到文件。通常,文件对象会自动缓冲数据,但在某些情况下,可能需要手动刷新

  • 示例:

    with open('example.txt', 'w+') as file:file.write('Hello, World!') 	# 写入文本file.seek(0)  					# 将文件指针移回文件开头content = file.read() 			# 读取文件内容file.writelines(['Line 1\n', 'Line 2\n', 'Line 3\n'])  	# 写入多行文本file.seek(0)cleaned_lines = [line.strip() for line in lines]  		# 去除每行末尾的换行符
    

eval():执行字符串命令

  • 将字符串当成有效表达式来求值并返回计算结果。

  • eval 函数的作用是去掉字符串最外面的一对引号,然后把去掉最外侧引号的字符串通过 python 语句的方式进行操作

  • 变量是为了获取去掉引号后的值,以便进行操作

  • 可同 input() 函数一起使用,获得用户输入的数值,使用方式为 变量=eval(input())

  • 示例:

    eval('print("aaaa")')		# 输出:aaaa
    

round() :截取小数点后几位

  • round() 是 Python 内置函数,用于将一个浮点数四舍五入为指定的小数位数。

  • 语法:

    round(number, ndigits)
    
    • number :是要四舍五入的浮点数。
    • ndigits :是要保留的小数位数,可以省略,默认为 0
  • 注意:round() 函数在处理浮点数时有一些潜在的问题,可能会导致结果与预期不符。如果对浮点数没有精度要求时,可以使用 round 函数。如果对浮点数的精度要求较高,推荐使用 decimal 模块。

  • 以下是一些常见的“坑”:

    • 精度丢失问题: 浮点数在计算机内部以二进制形式表示,某些十进制分数无法准确表示为二进制分数。这可能导致四舍五入时的精度丢失。
    • 奇偶规则: 当一个数刚好在两个可能的结果中间时,round() 函数采用奇偶规则(round half to even),也称为银行家舍入规则。这意味着它会选择最接近的偶数。
    • 大数问题: 对于非常大的浮点数,四舍五入可能会导致不准确的结果,因为浮点数的精度有限。
  • 示例:

    print(round(2.875,2))	# 输出:2.88
    # 精度丢失问题
    print(round(1.225, 2))	# 输出: 1.22,而不是 1.2。因为十进制的1.225无法准确表示为二进制分数
    # 奇偶规则
    print(round(0.5))  		# 输出: 0
    # 大数问题
    print(round(1e16 + 0.5))  # 输出: 10000000000000000,而不是 10000000000000001
    

vars() 函数

  • 用于返回对象的 __dict__ 属性。

    __dict__ 是一个字典,包含了对象的命名空间(即对象的属性和值)。

  • 将一个类实例传递给 vars() 函数时,它会返回该实例的属性和值的字典。

    将一个类传递给 vars() 函数,它会返回该类的命名空间(类属性和方法)。

  • 示例:

    class Person:def __init__(self, name, age):self.name = nameself.age = ageperson = Person("Alice", 30)# 返回实例的属性和值的字典
    person_dict = vars(person)
    print(person_dict)  # 输出:{'name': 'Alice', 'age': 30}# 返回类的命名空间(属性和方法)
    person_class_dict = vars(Person)
    print(person_class_dict) 
    # 输出:{'__module__': '__main__', '__init__': <function Person.__init__ at 0x...>, ...}
    

其他的简单函数

  • type() :用于获取对象的数据类型

  • range() :返回一个指定范围内的数字序列

    基本语法:

    range(start, stop, step)
    
  • len():用于获取序列(字符串、列表、元组等)的长度或项目数量

    fruits = ['apple', 'banana', 'orange', 'grape']
    print(len(fruits))		# 输出:4
    
  • sum() :计算序列(例如列表)中的元素总和

  • max()min() :用于找到序列中的最大值和最小值

  • abs():返回一个数的绝对值

  • sorted():对可迭代对象进行排序

  • enumerate():用于在迭代中获取元素的索引和值

  • zip():将多个可迭代对象的元素配对成元组

  • map():对可迭代对象的每个元素应用函数

  • filter():过滤可迭代对象中的元素

  • all()any():分别用于检查可迭代对象中的所有元素是否为 True 或是否至少有一个元素为 True

  • str.join():将字符串列表或其他可迭代对象的元素连接成一个字符串

  • chr()ord():分别用于将整数转换为字符和将字符转换为整数

相关文章:

Python 函数(lambda 匿名函数、自定义函数、装饰器)基本使用指南

Python 函数 函数是组织好的&#xff0c;可重复使用的&#xff0c;用来实现单一&#xff0c;或相关联功能的代码段 lambda 匿名函数 对于单行函数&#xff0c;使用 lambda 表达式可以省去定义函数的过程&#xff0c;让代码更加简洁&#xff1b; 对于不需要多次复用的函数&a…...

第五届芜湖机器人展,正运动助力智能装备“更快更准”更智能!

■展会名称&#xff1a; 第十一届中国(芜湖)科普产品博览交易会-第五届机器人展 ■展会日期 2023年10月21日-23日 ■展馆地点 中国ㆍ芜湖宜居国际博览中心B馆 ■展位号 B029 正运动技术&#xff0c;作为国内领先的运动控制企业&#xff0c;将于2023年10月21日参加芜湖机…...

JVM八股文

1.JVM的内存结构&#xff1f; 2.OOM是什么&#xff0c;怎么排查&#xff1f; 3.请解释四种引用是什么意思有什么区别&#xff1f; 4.GC的回收算法有哪些&#xff1f; 5.怎么判断对象是否存活&#xff1f; 1.什么是JVM内存结构 jvm将虚拟机分为5大区域&#xff0c;程序计数器、…...

代码随想录算法训练营第二十四天丨 回溯算法part02

216.组合总和III 思路 本题就是在 [1,2,3,4,5,6,7,8,9] 这个集合中找到和为n的k个数的组合。 相对于77. 组合 (opens new window)&#xff0c;无非就是多了一个限制&#xff0c;本题是要找到和为n的k个数的组合&#xff0c;而整个集合已经是固定的了[1,...,9]。 本题k相当于…...

【Python机器学习】零基础掌握AgglomerativeClustering聚类

如何解决城市规划问题? 城市规划者们面临一个复杂问题:如何合理地规划土地,使商业、居民、公园和其他设施互相便利,同时又不互相干扰?解决这个问题不仅需要对土地进行精准的分类,还要考虑到土地之间的相互关系。 借助层次聚类算法(Agglomerative Clustering),规划者…...

uniapp小程序中给web-view页面添加授权弹窗(使用cover-view组件覆盖实现该功能)

效果图&#xff1a; web-view是承载网页的容器。会自动铺满整个小程序页面&#xff0c;个人类型的小程序暂不支持使用。 再看下面一个提示&#xff1a; 每个页面只能有一个 web-view&#xff0c;web-view 会自动铺满整个页面&#xff0c;并覆盖其他组件。 也就是说&#xff0c;…...

2023年全球及中国CGT CDMO市场发展现状分析:CGT 渗透率有效助力CGT CDMO快速发展[图]

与传统药物相比&#xff0c;CGT的外包服务更注重活体开发过程&#xff0c;如质粒、病毒、细胞的生产及纯化。标准化、规模化的工艺流程对最终制备的产品起到重要影响&#xff0c;是获取及制备能够满足临床需求的高质量CGT产品的关键。 CGT CDMO服务内容 资料来源&#xff1a;共…...

上抖音热搜榜需要做哪些准备?

要想在抖音上获得高曝光&#xff0c;首先需要了解抖音热搜榜的算法和规则。抖音热搜榜的排名主要取决于作品的点赞数、评论数、分享数和播放量。其中&#xff0c;播放量是影响排名的关键因素。因此&#xff0c;在创作作品时&#xff0c;要注重提高作品的播放量。此外&#xff0…...

LDA代码训练报错记录

1、AttributeError: ‘CountVectorizer‘ object has no attribute ‘get_feature_names‘ 代码内容&#xff1a; tf_feature_names tf_vectorizer.get_feature_names()报错信息 AttributeError: CountVectorizer object has no attribute get_feature_names报错解析&#…...

【吞噬星空】爽翻,徐欣喜提永恒之体,罗峰秒杀败类,阿特金磕头认错

Hello,小伙伴们&#xff0c;我是小郑继续为大家深度解析国漫资讯。 吞噬星空动画第89集终于更新了&#xff0c;阿特金三大巨头的好日子到头了&#xff0c;从他们对徐欣出手的那一刻&#xff0c;就已经有取死之道。如今罗峰强势回归&#xff0c;上演复仇戏码&#xff0c;让大家看…...

【c++】跟webrtc学状态改变

peerconn的状态看起来只是为了通知上层PeerConnectionState // See https://w3c.github.io/webrtc-pc/#dom-rtcpeerconnectionstateenum class PeerConnectionState {kNew,kConnecting,kConnected,kDisconnected,kFailed,kClosed,};static constexpr absl...

【入门】.Net Core 6 WebApi 项目搭建

一、创建项目 1.1.创建新项目&#xff1a;打开开发工具>创建新项目>搜索API>选择C#语言的ASP.NET Core Web API 1.2.配置新项目&#xff1a;**自定义项目信息以及存储路径 1.3.其他信息&#xff1a;这里框架必须选择.NET 6.0,其他配置默认勾选即可&#xff0c;也可以根…...

xtrabackup备份 脚本

1、全量备份在周末晚上22点执行备份&#xff0c;增量是周一到周六晚上22点执行 2、考虑到增量备份第一次是根据全量备份开始备份&#xff0c;后面都是根据上一次增量备份在增量脚本做了if判断&#xff0c;周日做一次目录清理 3、每周日晚上91点50清理目录 22点就在次备份&#…...

13SpringMVC中拦截器的配置(拦截规则)和多个拦截器的preHandle,postHandle执行顺序原理详解

拦截器 Servlet中的过滤器的实现及其原理,参考文章 配置一个拦截器 SpringMVC中请求的处理流程: 用户请求—>listener—>filter—>DispatcherServlet—>filter—>preHandle—>controller—>postHandle 第一步: 编写一个Java类实现HandlerInterceptor(…...

Liunx中系统安全及文件系统(极其粗糙版)

PS&#xff1a;下面知识点还很粗糙下次有时间再改 系统安全&#xff1a; 系统安全和数据防护&#xff0c;数据备份的资质 比如三台服务器&#xff1a; 500万 工信部是有要求的&#xff0c;组织必须保证处理的个人数据的安全性 品牌形象如何维护呢 基于liunx的安全加固措施…...

Java中的数组

前言&#xff1a; 本篇博客将为大家介绍Java中的数组的相关知识。 目录 基本介绍 概念相关 数组的使用 数组是引用类型 应用场景 保存数据 作为方法的参数 作为方法的返回值 练习 数组转字符串 数组拷贝 求数组中元素的平均值 查找数组中的指定元素&#xff08;二…...

Java反射调用jar包实现多态

上一篇实现了反射调用jar包&#xff0c;但是没有实现多态&#xff0c;这次先给自己的jar包类抽象一个接口&#xff0c;然后实现类实现接口。最后调用放反射得到的对像转换成接口类型调用执行。 定义接口&#xff0c;指定包为ZLZJar package ZLZJar;public interface ITest {p…...

PowerBI 一些基础功能

1、PowerBI创建日期表 1.1、Power BI 日期表 - 知乎日期是做数据分析的时候使用最频繁的分析维度&#xff0c;一般建议建立单独的日期维度表&#xff0c;并与事实表的日期字段建立连接。 建立日期维度表可通过DAX函数的方式进行&#xff1a; 日期表 CALENDAR(DATE("2023&…...

Mac用命令行安装Adobe代码字体Source Code Pro

执行命令 brew tap homebrew/cask-fonts && brew cask install font-source-code-pro...

RustDay05------Exercise[31-40]

31.结构体申明 结构体在这里给了三种声明样式 (1)字典样式的键值对(使用花括号) (2)元组样式的数值元组(使用圆括号) (3)空结构体,可以被格式化输出名字 // structs1.rs // Address all the TODOs to make the tests pass! // Execute rustlings hint structs1 or use the…...

wireshark过滤器的简单介绍

wireshark过滤器的简单介绍 Wireshark的过滤器主要分为捕获过滤器和显示过滤器两种&#xff0c;其中捕获过滤器在数据包捕获时起作用&#xff0c;而显示过滤器用于在已捕获的数据包的集合中筛选数据。以下是一些Wireshark过滤器的详细介绍&#xff1a; 捕获过滤器&#xff1a;…...

数据结构:二叉树(1)

目录 树的概念 树的表示形式 二叉树 二叉树的性质 题目 二叉树的存储 链式存储 初始化二叉树 二叉树的遍历 前序遍历&#xff1a;根&#x1f449;左子树&#x1f449;右子树 中序遍历&#xff1a;左子树&#x1f449;根&#x1f449;右子树 后序遍历&#xff1a;左子…...

[nlp] chathome—家居装修垂类大语言模型的开发和评估

ChatHome: Development and Evaluation of a Domain-Specific LanguageModel for Home Renovation ChatHome: 家居装修垂类大语言模型的开发和评估 1、摘要: 我们的方法包括两个步骤:首先,使用广泛的家庭装修数据集(包括专业文章、标准文档和网络内容)对通用模型进行后预训…...

http(下)

http的工作流程&#xff1a; 客户端---服务端通信过程 请求----响应的模型 建立连接&#xff1a;tcp/ip协议与服务器建立连接&#xff08;三次握手&#xff09;&#xff0c;客户端向服务器的80端口发送连接请求 发送请求&#xff1a;一旦连接建立之后&#xff0c;客户端就像…...

Python学习基础笔记七十二——IDE集成开发环境

集成开发环境&#xff0c;英文缩写是IDE。 IDE可以帮你更高效地开发项目代码。因为它提供了非常实用的功能&#xff0c;比如项目文件管理、语法高亮、代码导航、自动补齐代码、语法静态检查、调试、版本控制等等。 两款IDE&#xff1a;Pycharm和VSCode。 pycharm中的代码文件都…...

[MQ]Win平台RocketMQ安装启动

1、下载 官网下载地址&#xff1a;https://rocketmq.apache.org/zh/download 2、解压ZIP包 解压rocketmq-all-x.x.x-bin-release.zip到目录。 比如我解压到了E:\Env\MQ_rocket\rocketmq-all-5.1.4-bin-release 3、配置环境变量 ROCKETMQ_HOME 4、RocketMQ JVM内存配置 这个需要…...

vscode工程屏蔽不使用的文件夹或文件的方法

一. 简介 vscode是一款 微软提供的免费的代码编辑软件。 对于 IMX6ULL-ALPHA开发板而言&#xff0c;NXP官方uboot一定会支持不止 IMX6ULL芯片的代码&#xff0c;也不止支持 一种架构&#xff0c;还支持其他芯片或架构的源码文件。 为了方便阅读代码&#xff0c;vscode软件可…...

黑马JVM总结(三十四)

&#xff08;1&#xff09;JMM概述 &#xff08;2&#xff09;JMM-原子性-synchronized java内存模型是如何保证原子性的呢&#xff0c;它是通过synchroized关键字&#xff0c;来达到这个目的的 第一个线程来了进入同步代码块之后&#xff0c;把这个对象加上锁了&#xff0c;…...

[linux]vncserver常用终端命令合集

开启vnc服务&#xff1a;systemctl start vncserver:1.service 关闭vnc服务&#xff1a;systemctl stop vncserver:1.service 重启vnc服务&#xff1a;systemctl restart vncserver:1.service 设置VNC密码: vncpasswd 开启VNC&#xff1a; vncserver :1 关闭VNC&#xff1…...

亚马逊、eBay,速卖通,国际站买家账号支付异常问题解决方法

如何解决下单被砍、封号问题&#xff0c;建议采取以下措施&#xff1a; 买家账号下单&#xff0c;不单纯只是解决支付卡、IP问题就可以了&#xff0c;因为平台大数据风控点很多&#xff0c; 我们防关联具体要解决几个问题 一&#xff1a;要硬件参数的关联、安全码、地区码、…...

小程序推广app/网络推广seo

简单工厂模式&#xff1a;简单工厂模式是属于创建型模式&#xff0c;又叫做静态工厂方法&#xff08;Static Factory Method&#xff09;模式&#xff0c;但不属于23种GOF设计模式之一。简单工厂模式是由一个工厂对象决定创建出哪一种产品类的实例。简单工厂模式是工厂模式家族…...

做动态网站必学/广告推广网站

💥 项目专栏:【Pandas数据处理100例目录】Python数据分析玩转Excel表格数据 前言 大家好,我是阿光。 本专栏整理了《Pandas数据分析处理》,内包含了各种常见的数据处理,以及Pandas内置函数的使用方法,帮助我们快速便捷的处理表格数据。 正在更新中~ ✨ 🚨 我的项目…...

网站建设基本流程包括哪几个步骤/seo网络推广优化

网站开发少不了有网站后台&#xff0c;有了后台自然要对用户有同角色来分配一下&#xff0c;特别是多用户系统的情况下&#xff0c;如我一个系统要有多个管理员&#xff0c;那么我这些管理要分成&#xff0c;编辑&#xff0c;友情连接&#xff0c;管理员等&#xff0c;那我们要…...

网站用微信登录 要怎么做/怎么制作网站链接

学习笔记 css position absolute relative 区别 相对定位 元素相对于他的起点进行移动&#xff0c;可以设置水平或垂直位置。 在使用相对定位时&#xff0c;无论是否进行移动&#xff0c;元素任然占据原来的空间。 <html><head><style>#div1 {width: 100px…...

邯郸做移动网站价格/外贸网站推广方式

文章目录1.回顾2.EnableWebMvc WebMvcConfigurer接口的使用原理3.总结1.回顾 根据之前的文章, 之前自定义的组件放入了容器中, 但是DispatcherServlet会使用自定义的组件而放弃了默认组件, 导致很多功能都失效了。 所以EnableWebMvc WebMvcConfigurer就是解决这个问题的 C…...

家装公司网站建设网站/百度识图在线入口

学习适配器有一段时间了,现在对BaseAdapter的优化和要是项目中用到的适配其很多的话,完全可以建立一个SimpleBaseAdapter(继承自BaseAdapter),方便扩展. 主布局代码: 1 <LinearLayout xmlns:android"http://schemas.android.com/apk/res/android"2 xmlns:tool…...