最近再玩耍树莓派gpio接口,需要一点点python知识

第一个python程序

""" python 的第一个小程序"""
# 注释
temp = input("请输入一个数")
a=int(temp)
if a>=10:
    print('你输入的数大于10')
else:
    print('你输入的数小于10')   

通过这一段简短的代码,现在可以分析出

  • c语言的缩进为了美观,方便我们去阅读代码,但是python就非常不一样了,缩进决定代码块的,和{}一样的作用。缩进可以用一个空格 ,也可以tab,只要缩进数一样,python就认为他们在一个代码块里面。
  • 无需 ;
  • 作为动态语言,声明变量无需指定类型
  • python 在没有 嵌套"" '' 的时候 是不必区分它们的
  • # 单行注释 or '''多行注释'''
  • if 后面是要加 : else: 定义函数,类都需要:
  • 补充:引入模块,import xxx ,if(a>=10) ()可以省略

变量

和JavaScript一样,定义的时候无需定义变量类型。

Python有五个标准的数据类型:

  • Numbers(数字)
  • String(字符串)
  • List(列表)
  • Tuple(元组)
  • Dictionary(字典)

Number 类型

其实还可以细分成

  • int
  • float
  • complex(python自带复数类型)

python 帮我们决定变量类型,var1=1.0 就是浮点型 var2=1就是整形

  • 对于数字 +-*/这样的运算可是少不了。整除运算 //

  • int() float() 转换他们之间的类型,int()直接去掉小数部分

  • abs()取绝对值

  • round() 四舍五入

  • pow(a,2)幂 a^2

  • math.ceil(3.4)=4 取顶 ,需要 import math

  • math.flood(3.4)=3 取底

字符串

其实和JavaScript的使用方法差不多

  • +可以连接字符串
  • str[1] 返回索引值所在的字符
  • len(str) 返回字符串的长度
  • 方法: string.split(';',1) 以 ;为节点 切1刀 ,第二个参数可以缺省,不在限制切的刀数
  • 方法 : string.capitalize() 第一个单词首字母大写
  • 方法: string.upper() 所有字母大写
  • 方法:string.lower() 所有字母小写
  • 方法 string.replace(''old,'new') 替换字符
  • 方法 string.find('aaa') 返回与aaa匹配的第一个单词的索引
  • 方法 string.isupper() 判断是否全部是大写
  • str(1) 将非字符串类型变成字符串类型

boolean

  • True 1
  • False 0

列表

和数组差不多,但是可以装不同的类型的数据。

list1 = [1, 2, 3, 'a', [2, 1]]
print(list1[4])

方法和属性

  • list.append(6) 加入数据6
  • list.pop(0) 删除第一个元素,如果不指定那么就删除做好一个
  • len(list) 返回列表长度
  • list.insert(0,5) 在一个元素位置插入一个数据5
  • list.index(2) 返回元素的索引
  • list.sort()排序
  • list.reverse() 颠倒元素顺序
  • list.remove('a') 删除 数据 a

元组

就是不能修改的列表,()包围起来

tuple1 = (1, 2, 3)
print(tuple1)
print(tuple1[2])

列表可以和元组相互转换 list(tuple1),tuple(list1);

字典

存储着键值对

dict={"键":"键值"}

dict1 = {"name": "越行勤", "age": "99"}
print(dict1["age"])

属性和方法

  • len(dict ) 输出键值对的个数
  • dict.keys()输出所有的键
  • dict.values() 输出所有的键值
  • 添加键值对 dict["key"]=values
  • dict.pop(key) 删除键值对

集合

set{1,2,'a',5}

集合不能由重复的元素,没有顺序概念

方法和属性:

  • set.add(5)加入元素
  • set.discard(5)删除元素
  • set1.intersection(set2) 输出两个集合的交集
  • set1.difference(set2) 输出set2相对与set1的差集
  • set1.issubset(set2) 判断set1是不是set2的子集

python 变量的本质

var =3
var = 4

python在变量上和其他语言本质不同,说python的变量还不如说成贴在数据上的标签,感觉和指针很相似

  1. 上边的例子指出, 当执行 "var = 3" 时, python会在内存中分配一块空间, 把"3"赋值给这块空间
  2. 当执行 "var = 4" 时, python 会再分配一块内存并存入"4", 然后将变量名 "var" 关联到"4" 所在内存.
  3. 此时"3"所在的内存并没有变化,也就是说无法修改开辟地址的数据
  4. c语言这类语言,int a=4 ; 是申请一段sizeof(int)大小的空间,存储着4,我们为这段的首地址地址起一个别名 a.我们可以通过a去访问存着 int 4 这段数据的地址 ,我们再去a=3; 是给a所代表的地址,写入数据 3

注意:我这里说的是 值类型变量,对于引用类型后面说

补充

我感觉自己越总结越着急,感觉说不到点上,

重新组织了一句话:python 变量是先有 数据 放到实现准备好的内存空间里去,然后再把变量名想标签一样贴到数据上去,改变值呢,又是把数据放到一个新的内存空间离去,然后再把标签从原来的标签上撕下来,贴到新的内存空间样。

而c语言呢? 就是先开辟内存空间,给内存地址起个别名,然后把变量放进去。

其实理解成指针也没啥错误,:happy:

也许这就是 python 没有c语言这类语言效率高的原因吧

值类型 引用类型变量

在python 中变量由可以分成 值类型和引用类型

  • 值类型(无法修改开辟空间对应的地址数据):字符串、元组、数子 布尔

  • 引用类型:列表、字典, 集合 字符串

这个概念和我们c++的引用感觉只有5%类似,不是别名的存在,但是本质上差不多

值类型

其实前面说过了,值类型就是我们理解的一般的变量: 修改值类型的值,只是让它指向一个新的内存地址,无法修改开辟空间对应的地址数据

引用类型

使用的是索引存储结构

索引存储结构
list1 = [1, 2, 3, 4]
list2 = list1
list2[1] = 3
print(list1)

输出一下,list1 发现是 [1,3,3,4]

list2 = list1,就好比把list1的地址给了 list2

改变list2,也会改变list1

但是如果是这样,

list1 = [1, 2, 3, 4]
list2 = list1
list2 = [1, 2]
print(list1)

list2 = [1, 2]就是把list2指向了一个新内存地址,该内存段存着 [1,2]

所以list1 还是为 [1,2,3,4]

定义一个函数

def get_sum(num1, num2=5):
    return (num1+num2)

定义函数无需定义返回值类型,但是要使用关键字 def ,返回也是使用return,参数可以缺省

不要忘了的:和缩进

类的使用

定义

# 定义类
class Person:
    # 构造函数
    def __init__(self, name, age, sex):
        self.name = name
        self.sex = age
        self.sex = sex

    def say_name(self):
        print("我的名字叫: "+self.name)

构造函数 __init__(self,a,b) 名字是固定的,和其他编程语言一样,self代表类的实例,而非类

序号方法, 描述 & 简单的调用
1init ( self [,args...] ) 构造函数 简单的调用方法: obj = className(args)
2del( self ) 析构方法, 删除一个对象 简单的调用方法 : del obj
3repr( self ) 转化为供解释器读取的形式 简单的调用方法 : repr(obj)
4str( self ) 用于将值转化为适于人阅读的形式 简单的调用方法 : str(obj)
5cmp ( self, x ) 对象比较 简单的调用方法 : cmp(obj, x)

内置类属性

  • __dict__ : 类的属性(包含一个字典,由类的数据属性组成)
  • __doc__ :类的文档字符串
  • __name__: 类名
  • __module__: 类定义所在的模块(类的全名是'main.className',如果类位于一个导入模块mymod中,那么className.module 等于 mymod)
  • __bases__ : 类的所有父类构成元素(包含了一个由所有父类组成的元组)

使用类

# 声明 
person1 = Person('越行勤', 99, '男')
# 调用方法
person1.say_name()

条件语句和循环

条件语句

temp = input("请输入一个数")
a=int(temp)
if a>=10:#if ():
    print('你输入的数大于10')#代码块
elif a>20: #elif ():
    print('你输入的数大于20')#代码块
else:
    print('你输入的数小于10') #else: 

while循环

用法和 c语言的while差不多,但是格式不一样

a = 10

while a > 5:
    a = a-1
    print(a)

for 序列循环

序列:字符串,列表,元组

和JavaScript变量类一样

string = "lajslkaj;flia[isfp[sjanc"
for c in string:
    print(c)

for 循环的妙用

for i in range(10):
    print(i)

其实这个和我们的计数器是一个道理了,这个就是i 从 0 循环到 9,每次加1 也就是

for(int i;i<10;i++)
{
    printf("%d\n",i);
}

当然 我们也可 指定 i的初始值

for i in range(5,10):
    print(i)

相当于:

for(int i=5;i<10;i++)
{
    printf("%d\n",i);
}

控制循环

break:直接退出循环

continue:跳出本次循环

努力成长的程序员