博客摘录「 【Python】9.函数用法和底层分析」2025年3月4日

程序的可读性最重要,一般建议在函数体开始的部分附上函数定义说明,这就是“文档字符串”,也有人成为“函数的注释”。我们通过三个单引号或者三个双引号来实现,中间可以加入多行文字进行说明。
函数名.__doc__可以打印文档字符串



全局变量:储存在栈中
局部变量:储存在栈帧(stark frame)中,函数运行结束,栈帧销毁


#测试局部变量、全局变量的效率

import math
import time

def test01():
    start = time.time()
    for i in range(10000000):
        math.sqrt(30)
    end = time.time()
    print("耗时{0}".format((end-start)))

def test02():
    b = math.sqrt
    start = time.time()
    for i in range(10000000):
        b(30)
    end = time.time()
    print("耗时{0}".format((end-start)))

test01()
test02()







我们在前面讲的类定义格式中,“class 类名:”。实际上,当解释器执行class语句时,就会创建一个类对象。


  1. 类方法中访问实例属性和实例方法会导致错误
  2. 子类继承父类方法时,传入cls是子类对象,而非父类对象、

在其他语言中,可以定义多个重名的方法,只要保证方法签名唯一即可。方法签名包含3个部分:方法名、参数数量、参数类型。

Python中,方法的的参数没有声明类型(调用时确定参数的类型),参数的数量也可以由可变参数控制。因此,Python中是没有方法的重载的。定义一个方法即可有多种调用方式,相当于实现了其他语言中的方法的重载。


Python是动态语言,我们可以动态的为类/对象添加新的方法,或者动态的修改类的已有的方法。


python对类的成员没有严格的访问控制,实际上并没有私有属性这一说,我们约定两个下划线靠头的为私有。这些私有存储在_类名__属性名(方法名)中。

从打印的Employee对象所有属性我们可以看出。私有属性“__age”在实际存储时是按照“_Employee__age”这个属性来存储的。这也就是为什么我们不能直接使用“__age”而可以使用“_Employee__age”的根本原因。


property修饰的属性,如果没有加setter方法,则为只读属性。此处修改报错:AttributeError: can't set attribute   

@property       #【property属性】
    def age(self):
        return self.__age
    @属性名.setter
    def age(self,new_age):
        self.__age=new_age


多态的实现。一个方法的调用根据传入的类型不同,有不同的输出。多态的实现依赖于继承和重写

# 多态

class Man:
    def eat(self):
        print("饿了,吃法啦!")

class Chinese(Man):
    def eat(self):
        print("中国人用筷子吃饭")

class English(Man):
    def eat(self):
        print("英国人用叉子吃饭")

class Indian(Man):
    def eat(self):
        print("印度人用右手吃饭")

def manEat(m):
    if isinstance(m,Man):
        m.eat()    # 多态,一个方法调用,根据对象不同调用不同的方法
    else:
        print("不能吃饭")

manEat(Chinese())
manEat(English())
Chinese().eat()    # 与 m.eat() 效果相同
 



main__”。我们可以根据这个特点,将模块源代码文件中的测试代码进行独立的处理。例如:每个模块都有一个名称,通过特殊变量__name__可以获取模块的名称。在正常情况下,模块名字对应源文件名。仅有一个例外,就是当一个模块被作为程序入口时(主程序、交互式提示符下),它的__name__的值为“__

我们一般通过import 语句实现模块的导入和使用,import 本质上是使用了内置函数__import__()
当我们通过import 导入一个模块时,python 解释器进行执行,最终会生成一个对象,这个对象就代表了被加载的模块。

当导入一个模块时, 模块中的代码都会被执行。不过,如果再次导入这个模块,则不会再次执行。

Python 的设计者为什么这么设计?因为,导入模块更多的时候需要的是定义模块中的变量、函数、对象等。这些并不需要反复定义和执行。“ 只导入一次import-only-once”就成了一种优化。

一个模块无论导入多少次,这个模块在整个解释器进程内有且仅有一个实例对象。

导入包的本质其实是“导入了包的__init__.py”文件。也就是说,”import pack1”意味
着执行了包pack1 下面的__init__.py 文件。这样,可以在__init__.py 中批量导入我们需要
的模块,而不再需要一个个导入。

  1. 作为包的标识,不能删除。
  2. 用来实现模糊导入
  3. 导入包实质是执行__init__.py 文件,可以在__init__.py 文件中做这个包的初始化、以及需要统一执行代码、批量导入。

windows 操作系统默认的编码是GBK,Linux 操作系统默认的编码是UTF-8。当我们用open()时,调用的是操作系统打开的文件,默认的编码是GBK。
【示例】中文字符文件,乱码出现测试

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值