目录

todo 未完有空续

基础语法

注释

打印输出

打印输出都有哪些方式

退出脚本

调试方式

运算符

  • 关系运算符:仍然适用,比如! == 等
  • 逻辑运算符:and or not(注意python中不是使用!符号作为非)

字符串

定义、增删改查连接、遍历、访问元素、判断空

  • 字符串连接符 :+ 号

  • 字符串支持数组方式访问字符串中的元素 str[1]

  • len()函数可计算字符串长度

  • 截取子字符串:str[n:m],从第n+1个位置开始,截取m个字符,返回子字符串;[:m]表示从第一个开始取m个字符,[n:]表示从n+1个开始截取到结束

  • 字符串是不可变的,虽然字符串支持使用数组的访问方式,但不能使用数组的赋值方式改变字符串的元素值,str[1]='b’,这是不允许的

  • str.find(“z”)方法支持查询字符串中的z字符

  • in是一个布尔运算符,‘a’ in ‘apple’,返回True布尔值

  • 字符串也是支持采用for…in…的方式遍历

  • 字符串也支持关系运算符直接比较 == < >

  • strip()方法(不是函数),类似于php的trim方法,可以去除前后字符,无实参时,默认去除空格

  • 字符串拼接和重复与整数的加法和乘法

    "a"*3
    # 等同于:
    "a"+"a"+"a"
    

列表List

可以对比和php的数组,也和python的字符串一样,除了可变外。

定义、增删改查合并、遍历、访问元素、判断空

  • range(n)函数,返回0到n-1下标的列表

  • 列表操作符

    +号可以拼接列表:a+b,返回新的列表

    *号可以重复列表: a * 4

    :号同样可以用来切片:a[:n]

  • 列表方法:

    append方法:支持新增元素,修改列表 extend方法:类似+操作,列表扩展合并另一个列表 sort方法:排序

  • 删除元素

    del a[1] : 直接删除第二个元素

    b = a.pop(1):取出第二个元素,并删除

    a.remove(‘a’):删除值为a的元素

  • list内置函数 list()可以创建一个列表 list()也可以将字符串转换成列表:a = list(str)

  • 列表与字符串

    • split方法将字符串通过分隔符转换成列表,分隔符作为split的形参。方法类似于php的explode函数。
    • join方法将列表通过分隔符合并成字符串,但要注意join是分隔符的方法,不是字符串的方法,字符串是作为join的形参。类似于php的implode函数。

字典

字典,除了key和列表不一样外,其他相似。使用花括号:{}定义。但可以使用方括号[]访问元素。列表的key是纯数字的,字典的key可以是很多种类型:数字,字符串

d = {"a":"apple","b":"banana"}

字典,也有叫映射,也有叫键值对

定义、增删改查合并、遍历、访问元素、判断空

  • dict函数:生成一个字典,特别是可以将元组列表(比如dataDict.items())还原为字典
  • len函数:也适用于字典计算元素个数
  • in关键字:在字典里默认只能检查是否存在key,如果要检查是否存在某个值,可以先通过values方法返回值集合(类型不是list,而是dict_values),通过a in d.values(),判断是否存在值a
  • get方法:d.get(‘a’,0),获取某个键值,默认返回0
  • for x in d,遍历字典,x是键,不是值
  • sorted函数:字典遍历是无序的,如果需要按顺序遍历字典,可以使用for x in sorted(d)
  • global:全局变量。和php一样,我也不建议使用global关键字。

元组

元组与列表的区别在于元组的不可变性。

t = 'a', 'b', 'c', 'd', 'e'

t = ('a', 'b', 'c', 'd', 'e')
  • tuple函数:创建一个元组,同样也可以将字符串转换成元组

  • 元组有个常用的操作:两个变量互换值

    a = "apple"
    b = "banana"
    
    a,b = b,a
    
    print(a)
    print(b)
    
  • 元组还常用函数/方法的返回值

    def test(): return a,b,c

    t = test() # t=> (a,b,c) aa,bb,cc = test()

  • 汇集形参,*args。汇集形参结合lambda匿名回调有不错的效果

    def max_len(*lists):
        return max(*lists, key=lambda v: len(v))
    
    r = max_len([1, 2, 3], [4, 5, 6, 7], [8])
    print(f'更长的列表是{r}')
    
  • 元组与字符串

    字符串split方法,通过分隔符将字符串转换成列表,还可以将列表中的前面几个元素直接赋值给元组:

    a,b = str.split("-")

  • 元组与字典

    字典有个items方法,返回多个(key,value)元组组成的列表

    d = {'a':0, 'b':1, 'c':2}
    t = d.items()
    print(t)
    # dict_items([('c', 2), ('a', 0), ('b', 1)])    
    

元组的其他操作可以参考列表,比如访问、切片

注意:但元组和字符串一样,不允许通过赋值的方式改变元组元素 t[0] = ‘c’ # 这是不允许的

集合

集合(set)是一个无序的不重复元素序列。

可以使用大括号 { } 或者 set() 函数创建集合。

注意:创建一个空集合必须用 set() 而不是 { },因为 { } 是用来创建一个空字典。

parame = {value01,value02,...}
或者
set(value)

常用方法:

  • add
  • remove
  • clear

更多集合方法或函数

文件

import os

os.path.* 提供文件名和路径的访问方法及判断方法比如:

isdir、isfile、exists、abspath、

数据库

import dbm

管道

cmd = 'ls -l'
fp = os.popen(cmd)
res = fp.read()
stat = fp.close()

编写模块

有个wc.py文件

def linecount(filename):
    count = 0
    for line in open(filename):
        count += 1
    return count

if __name__ == '__main__':
    print(linecount('wc.py'))

另外个test.py文件

import wc

wc.linecount('wc.py');

__name__是一个在程序开始时设置好的内建变量。 如果程序以脚本的形式运行,__name__ 的值为 __main__ ,这时其中的代码将被执行。否则当被作为模块导入时,其中的代码将被跳过。

数据流程

判断

有哪些类型的判断,怎么判断

在Python中,False,0,'',[],{},()都可以视为假。

循环

有哪些常用循环类型,怎么循环

  • for x in y 与js的for in 是不一样的,x直接就是y中的元素值,而不仅仅是key而已

函数

定义、访问

定义、访问

  • __init__ 是初始化方法,如js的constructor,php的__constructor
  • self,类中的每个方法第一个形参必须一个类本身,常用self变量名,也可以是其他变量名
  • __前缀的属性或方法属于私有属性或私有方法,其他皆为公用方法或属性,外部可直接访问。在面向对象这方面python确实简洁到不如java和php细致。

特殊区别

  • +号作为字符串的连接符号,和js一样,但php用.符号

  • self 代表的是类的实例,代表当前对象的地址,而 self.class 则指向类。

    self 不是 python 关键字,我们把他换成 self1 也是可以正常执行的:

    class Test:
        def prt(self1,str):
            print(str)
            print(self1.__class__)
      
    t = Test()
    t.prt("helo")
    
  • 类型转换:int() 用于转换数字字符串为数值,对完全字符串无效 float() str()

  • type()查看变量类型

  • math模块,提供了大部分的常用数学函数

  • 文档字符串 “““dddddd”””

  • is关键字:判断两个变量是否指向同一个对象(地址)

  • in关键字:元素是否在字符串或列表中

  • 变量和对象之间的关联叫:引用

  • 一般情况下,字符串定义赋值相同时,都是指向同一个对象。而其他列表、字典、类等即使定义且赋值相同的值,他们还是使用不同的对象,而如果是对象赋值给对象,则存在多个引用指向同一个对象,其中一个引用更改了对象值,则其他引用也跟着改变,这个和大部分语言是一致的。

  • zip:将对象中对应的元素打包成一个个元组,然后返回由这些元组组成的列表;

    a = [1,2,3]
    b = [4,5,6]    
    zipped = zip(a,b)     # 打包为元组的列表
    [(1, 4), (2, 5), (3, 6)]
    ```
    
    
  • random.randint() ;random.choice(t)

  • repr函数:它接受任意一个对象作为参数,然后返回一个该对象的字符串表示。对于空白符号,它将用反斜杠序列表示:‘1 2\t 3\n 4’

  • copy模块 copy.copy(),复制后的对象,将不会是同一个对象。当然这个也是浅拷贝,没有复制嵌套的对象。copy.deepcopy()就是深拷贝。

  • any函数:any(false,true,false),只要有一个为真就返回true;not any也可以结合使用。

  • all函数:即都为true才返回true。

  • lambda:理解成匿名回调函数, lambda x:x*2,意思就是 function(x){return x*2}

问题

  • 注释与自动提示不够完善
  • 字符串处理还没有php强大
  • 面向对象的语法不自然,比起java和php的写法略显小儿科

优点

  • 相对于java、php、js,语法更简洁(简洁不代表自然),比如省去不必要的$、var、流程控制的大部分符号(括号、花括号、分号),public、protected等面向对象关键字