zoukankan      html  css  js  c++  java
  • 通过C学Python(1)关于语言、数值类型和变量

    强类型语言,不可能出现“程序执行出错后仍可继续执行,并且该错误导致的问题使后续执行可能出现任意行为”这类错误,这类错误的例子,如C里的缓冲区溢出、Jump到错误地址。

    弱类型语言,类型检查更不严格,如偏向于容忍隐式类型转换。例如C语言中int类型和double类型的隐式转换。(个人认为int型和指针型的自由转换,以及union中的一个int对4个char更能说明问题)

    静态类型语言,在编译时就拒绝类型错误导致的问题

    动态类型语言,在运行时才报出类型错误

    C语言是弱类型、静态类型

    python是强类型,动态类型

     

     

    数值类型:

    整型 int 

    C中整型数据按照内存占用有好多种,python里面只有一种

    浮点型 float

    C中有float和double两种,python里面只有一种

    布尔型 bool

    C中用宏TRUE和FALSE对应常量1和0,在python中True和False是属于单独的数据类型bool,但是内部实现依然是1和0,例如:1+True==2,1*False==0

    复数型 (在python中用小写 j ,表示虚部,用其他的字母不行)complex

    C中没有这个类型,需要自己定义一个结构体和一系列运算函数,但是C99/C++有添加这种数据类型。python中有这个数据类型,就可以很方便的进行复数运算

    空类型 NoneType

    C中用宏NULL表示空,对应常量0,在python中None是属于单独的数据类型NoneType,与常量0不同,不能与数值做运算,其实这也并不能算作数值类型

    数值运算常用运算符:

    + - * %加、减、乘、取模,和C都一样
    / 除,即使是两个整型数据相除,得到的结果也可能是浮点数

    // 整除,向下取整,和C语言中的整型相除效果一样,没有小数部分

    ** 乘方(幂),C对应的函数是pow,当然直接用乘方运算符用起来会更好看且易于理解

    赋值运算符 :
    = += -= *= /= //= 等...  和C的用法基本一致,python没有++,自增1要用+=1

    变量:
    Python的变量无需事先声明,无需指定类型,但是每个变量都是有类型的

    Python中每个变量、常量都有一个id,可以通过内置函数id()来取得,通过这个函数可以看到一些特性:

    实验一:a = 2  ,b = 2 ,这时分别查看id(a)、id(b)、id(2)可以发现,他们三个的值是一样的,就好像是三个指针指向了同一个地址,而这个地址上的数据就是2

    实验二:a = 1 ,id(a) , a = 2, id(a) ,这时可以看到,a的id发生了变化,也就是说这两个a并不是同一个a了

    通过这些现象来看,变量a、b并没有用独立的存储空间去存放值,而更像是指针,指向了一块内存区域,id()就是取出来目标地址,而在取变量a的值的时候,先通过id(a)找到目标地址,再把目标地址存放的数据取出来

    经过我的测试实验,True\False\None的id都是固定的,整型数据中从-5到256的id也是固定的,符合实验一的现象,既分别给a和b赋同一个常量值,他们的id是一样的,但是如果查出这个范围,比如-6,进行下一个实验

    实验三:a = -6,b = -6,这时id(a) == 2518190220080,id(b) == 2518190220496,两个变量的id不同,但是值相同,说明他们的值分别另外开辟了空间,存储了相同的值-6

    实验四:在实验三的基础上,b=a,这时id(a) == 2518190220080,id(b) == 2518190220080,他们的id相同,指向了同一个地址。

    经过实验,把-6换成浮点数、元组和列表,也符合实验三和实验四

    实验五:a=[1,2],b=a,a.append(3),这时,id(a)和id(b)相同,并且b的值也变成了[1,2,3],这验证了上面说的,变量其实并没有存放变量值,而是存放了目标地址,取变量值的时候,先去目标地址,再把值取出来

  • 相关阅读:
    The Node.js Event Loop, Timers, and process.nextTick()
    Main event loop
    Why should I avoid blocking the Event Loop and the Worker Pool?
    HTML Standard系列:Event loop、requestIdleCallback 和 requestAnimationFrame
    在这个示例中,使用 watch 选项允许我们执行异步操作 (访问一个 API),限制我们执行该操作的频率,并在我们得到最终结果前,设置中间状态。这些都是计算属性无法做到的。
    多线程 主线程
    mvvm
    跨库事务
    nginx 死循环
    nginx proxy pass redirects ignore port
  • 原文地址:https://www.cnblogs.com/ikamu/p/8285283.html
Copyright © 2011-2022 走看看