Python3补充知识点

2022-09-28 20:29:20 浏览数 (1)

[TOC]

####

Python与C数据类型

WeiyiGeek.基本数据类型在Python与C之间的对应关系

采用字典实现switch条件选择

描述:初学python语言,竟然很久才发现python没有switch-case语句,查看官方文档说是可以用if-elseif-elseif代替,同时也用其他的解决方案比较简单的就是利用字典来实现同样的功能。

写一个字典每个key对应的值是一个方法如:

switch = {“valueA”:lambda x,y:functionA(x,y),”valueB”:functionB,”valueC”:functionC}

示例演示:

代码语言:javascript复制
#!/usr/bin/env python
# python中switch...case语句

#调用的函数
def add(x,y):
    print("case c :switch c 字典形式调用add函数: %d   %d =  %d" %(x,y,x y))

def div(x,y):
    return "switch b 字典调用div函数: %d   %d  = %f" %(x,y,x/y)

#字典形式中的lambda表达式来实现switch语句效果
switch = {
    'a':lambda x:x**2,
    'b':lambda x,y:div(x,y),
    'c':lambda x,y:add(x,y)
}
#采用 try...except来捕获异常
try:
    print("case a : ", switch["a"](2))  #4
    print("case b :", switch['b'](8,2)) #4.0
    switch["c"](2,5)       #根据字典key值来调用函数  #7
except KeyError as e:
    print("捕获到异常!")


#执行结果
case a :  4
case b : switch b 字典调用div函数: 8   2  = 4.000000
case c :switch c 字典形式调用add函数: 2   5 =  7
ctype模块的三种不同动态库链接方式(python)

问题:如果理解函数调用的约定? 答:函数调用约定(calling convention) 描述了如何正确的方式调用某些特定类型的函数,包括了函数参数在站上的分配顺序,有哪些参数会被压入栈中,而那些参数将通过寄存器传入,以及在函数返回时函数栈的回收方式等;

两种最基本的函数调用约定:

cdecl : 规定了函数参数列表从右向左顺序入栈,并有函数调用者负责清理栈上的参数,在X86架构被C编译器广泛使用;

代码语言:javascript复制
#C语言形式:
int python_rocks(one, two, three)

#x86汇编语言形式 (从右向左)
push three
push two
push one
call python_rocks
add esp, 12  #每个参数占用四个字节空间

stdcall :约定为Win32 API所广泛使用,

代码语言:javascript复制
#C语言形式:
int python_myrocks(one, two, three)

#x86汇编语言形式 (从右向左)
push three
push two
push one
call python_myrocks

两者之间的相同/区别:

  • 相同:参数入栈顺序,两者函数调用都约定选用EAX寄存器存放函数返回值;
  • 区别:回收函数栈的工作并非由函数调用者完成,而是有被调用者本身python_myrocks在函数返回前自相负责清除;

ctype模块的三种不同动态库链接方式:

  • 1.cdll():用于加载那些遵循cdecl标准函数调用约定的链接库;
  • 2.Windll():用于加载那些遵循从stdcall调用约定的动态链接库,stdcall是微软Win32API所使用的原生调用约定;
  • 3.Oledll():使用方法与windll完全类似,只是oledll会假定其载入的函数会统一返回一个windows hresult错误编码,这些错误编码专门服务于微软的COM(组件对象模型)函数,用于表示错误信息;

0 人点赞