Python全栈学习笔记---基础篇(一)

  • python缩进分代码块

  • if __name__='__main_': //检查模块是被导入的还是直接执行,如模块是被直接执行,那么其值为__main__      

          __name__ //如模块是被导入,那么其值为模块名//函数的属性,其值为函数名

          .py作为模块,该模块不会执行
          .py作为脚本,该模块会执行

一、标识符定义规则:

  • 可由下划线、数字、字母组成,
  • 数字不可用于开头
  • 不可空格
  • python区分大小写

  命名规则:

  1、驼峰法

    小驼峰式命名法(lower camel case): 第一个单词以小写字母开始;第二个单词的首字母大写,例如:userName

    大驼峰式命名法(upper camel case): 每一个单字的首字母都采用大写字母,例如:UserName

  2、下划线

    例如:my_name

     注:

      __XXX //类的私有变量名/函数名,不能在类外使用
      __XXX__ ///系统定义名字

  

二、数据类型与变量:

  1、数值类型:

    1.1、整数类型:也包含负数

      int   (有符号整数) //一般字符占32位,不会出现溢出错误,会自动转换成长整型->int和long无缝结合,长整型后缀“L”变得可有可无       

      long    (长整型)   //不区分短长整型
      表示:
        十进制
        16进制::0x|0X开头
        8进制:0o|0O开      ’

        %d 十进制
        %s 字符串
        %f 浮点数
        %x 十六进制

    1.2、浮点类型(float):带小数点及小数的数字

    浮点数的取值范围由计算机系统决定
      import sys
      sys.float_info,可查看取值范围
      表示方法:
      数字.数字
      <a>e<b>=a*(10的八次方)
    1.3、复数类型 : z = a + bj  // j 表示为复数

1 z = 1 + 7j
2 print(z)
3 print(z.real) #复数实数部分
4 print(z.imag) #复数虚数部分

    注:三种类型关系:
      a、转换方式:
        int() float() complex()
        整数->浮点数->复数

      b、不同类型混合运算,结果为最宽类型

  2、bool(布尔值)False=0|True=1  //在数值上下文中会被当成数值

  3、字符串:不可更改其中一个字符,只能整个改变

    可使用双、单引号,三引号(三个连续的单、双引号)可包含特殊字符

    下标(索引)【可用负数表示】:

        0  1  2  3  4

           -5  -4 -3 -2- 1

    3.1、子字符串切片操作[start:end:add=1]

     str_name[下标]:可用负数表示 //不能使用name[下标1]=name[下标2]
     str_name[n:m]:从n到m-1
     str_name[:m]:从0到m-1

     str_name[n:]:从n到length-1

      str_name[::-1] //翻转字符串

    3.2、字符串拼接
      ·+:将字串连接 str1 + str2

        注:字符串和数值连接时,数值需转化为字符型
      ·最优法:
        str3=''.join([str1,str2....])  

1 1 str1 = '012345'
2 2 str2 = 'dddddd'
3 3 str3 = ''.join([str1, str2])
4 4 print(str3)
5 >>>012345dddddd
View Code

      ·字串*数字:将字串重复几遍

     3.3内建函数:

 

 注:虽然数字的字符串值被认为与整型值和浮点型值完全不同 , 但整型值可以与浮点值相等,例:3= 3.0。

  4、空值(None):类型:NoneType

   5、变量

     全局变量(): 

     在这个模式下的变量可被任何函数访问,但不可被重新赋值(不可直接用等号,但是像列表的内置函数append()是可用的)而是直接引用,会沿LEGB
        (local->enclosing->global->bulit-in)的顺序查找变量

     若被重新赋值则python内部会重新定义一个同名局部变量覆盖掉该全局变量,

  • 若要全局变量可在局部作用域被重新赋值:

       可在局部作用域中声明该变量为全局变量,在函数中定义全局变量 :
          global x
          x += 1

  • 若未定义全局变量但该变量为全局变量(nonlocal :表示非局部变量):

        nonlocal x
        x += 1

 

三、赋值与运算:

  python不需定义变量类型,类型与值在赋初值是被初始化

  3.1、多元赋值:

    x, y, z = 1, 2, 3 //x=1,y=2,z=3//两方均加上括号更好

   3.2、运算符

 

  

+:加

-:减

%:求余

*:乘

/:浮点除

//:地板除(舍小数)

**:乘方运算  几次方

+=:n=n+m

-=: n=n-m

*=: n=n*m

/=: n=n/m

%=: n=n%m

and:且

or:或

not:非

>= 、<= 、

== !=

>、<

  • is: 比较是否为同一对象(内存地址是否相等)
  • ==:比较是否值相同,内部实际为调用.__equal__()
    注:python仅仅对比较小的整数对象进行缓存(范围为范围[-5, 256])缓存起来,而并非是所有整数对象。
    需要注意的是,这仅仅是在命令行中执行,而在Pycharm或者保存为文件执行,结果是不一样的,这是因为解释器做了一部分优化

  3.3、链式比较

    支持2<3<4、a==b==c 等价于(a==b) and (b==c)

 

四、输入输出

    2.x:print 

    3.x:

  • print('%s%d'%(str,num))      
  • print 不换行 :
    •   print(name,end='',flush=True)//end中加各种符号,如空格
  • 格式输出,中文英文对齐:

    print("{0:{n这里应该填充chr(12288)的位置数}<对齐><宽度>}\t{1:}".format(name1,name2,……,chr(12288))) 第几个       

      》》:引导符号

      》》<填充>:填充单个字符

       》》<对齐>:

·       < :左对齐
·       > :右对齐
       ^ :居中

       》》<宽度>:槽的设定输出宽度

      》》<.精度>:浮点数小数部分的精度,或字符串的最大输出长度

      》》<类型>:

      ·整型:b、c、d、o、x、X
      浮点数类型:e、E、f、%

 

当中文字符宽度不够时,系统自动采用西文字符填充;中西文字符占用宽度不同

采用中文字符的空格填充 ch(12288)

  2、输入:

获取的用户输入内容为字符型

3.x:intput("string")    //文本输入可加字符串

input(str_name)    //  类型为str

输入字符串转化为整型: int()

与listl连接:

list_name = [12, 123 ]
list_name.extend(input())

输入:
    aafafafa
输出:
    [12, 123, 'a', 'a', 'f', 'a', 'f', 'a', 'f', 'a']

 

2.x: raw_input("string")    //文本输入 2.

五、判断 (if):

  • if expression: else:
  • if expression: elif expression:…… else:

  pass:什么也不执行

六、循环【loop】:

6.1、for

for i in Iterator:
.....
else: //当循环所有步骤都执行后,执行else后的代码块

  • for name in List: //遍历List
  • for value in dic_name.value() //迭代value
  • for key,value in dic_name.item() //迭代key,和value
  • for name in range(num): //name遍历为0到num-1的数,常用range(len(name))

注:list(range(start,end,add=1))

  • for num, ch in enumerate(name)//num遍历为name的下标,ch遍历为name的值

6.2、while

while expression:
  break/continue

6.3、列表解析

lists=[x+1 for x in range(num) ]   //x从零开始参加运算并按顺序存到lists中 num为lists的长度
lists=[x+1 for x in range(num) if expression ]   //若满足条件x参加运算按顺序存到lists中 num为循环次数
lists=[x+y for x in lists1 for y in lists2]     //[x1+y1,x1+y2……]

  6.4、生成器 generator:
    lists=(x+1 for x in range(num) ) //列表元素由某种算法在循环中一个一个推导,节省空间

    yield //在函数中使用,把某个函数定义为生成器

    显示函数返回值

while True:
   try:
     x = next(g)
     print('g:', x)
   except StopIteration as e:
     print('Generator return value:', e.value)
   break

next(g) //返回generator的下一个返回值

  6.5、迭代器:

  • 凡是可作用于for循环的对象都是Iterable类型;list dic tuple 等
  • 凡是可作用于next()函数的对象都是Iterator类型,它们表示一个惰性计算的序列;
  • 集合数据类型如list、dict、str等是Iterable但不是Iterator,不过可以通过iter()函数获得一个Iterator对象。

 

七、List&Tuple&Dict&set:

  7.1列表Lists:相当于数组 //元素的值和个数可以改变
    对Iterator批量修改用while

    lists = [num,str,list,……] //任意python的对象

  • 元素下标可以负数表示://lists[num]输出为其值     0 1 2 3 4
        -5 -4 -3 -2 -1
  • 当list为空时,list_name[-1] 会报错错误

    +: 连接
    *num: 对list进行num次重复
    len(串列):串列长度
    切片操作同字符串 //输出带[,,]
    切片操作:顾头不顾尾
      start:end:递增倍数]
        start:第一个索取数

  • end:截止到哪一个且这一个不取,一般从取负数,可为空则取从start开始的所有值
  • 若a[start]和a[end]所指为列表中的同一位置则a[start:end:递增倍数]=a[start]=a[end]
  • 只能取[start,end)或(end,start]区间内的值
  • 递增倍数:索引以多少递增,默认为 1,+:向右取,-:向左取

    修改元素:赋值
    多值修改,可结合切片操作,最好一一对应,不然没有改的就被删除

增加元素

 

删除元素

 

.append(x)

添加到末尾

.remove(x)

删除List中x,如果有List中有多个x删除首次的值

.insert(i,x)

插入到lists[i]

.pop()

删除lists末尾元素并返回该值

.extend(list2)

list2添加到list末尾

.pop(i)      

删除lists[i]并返回该值

 

 

del list[i]

 

查询元素

 

 

 

x in list

 

.count(x)

返回x在list中的个数

.index(x)

返回第一次出现x的索引值,没有则报错

 

 

常用内建函数

.sort()

    

    

    

    sum(list_name)

排序

.sort(reverse=True

翻转排序

sorted(list_name)

对列表临时排序

.reverse()

 

翻转

元素全为数字时:

max(list_name)

min(list_name)

sum(list_name)

 

 

    特点:
      查找和插入的时间随着元素的增加而增加;
      占用空间小,浪费内存很少。

为什么切片和区间会忽略最后一个元素?

·当只有最后一个位置信息时, 我们也可以快速看出切片和区间里有几个元素: range(3) 和 my_list[ : 3] 都返回 3 个元素。
·当起止位置信息都可见时, 我们可以快速计算出切片和区间的长度, 用后一个数减去第一个下标( stop - start) 即可。
·这样做也让我们可以利用任意一个下标来把序列分割成不重叠的两部分, 只要写成 my_list[ : x] 和 my_list[ x: ] 就可以了


 

  7.2、元组(tuple):相当于数组 //元素值不可改,但可以直接重新对tuple赋值
    7.2.1、创建方式:

      元组其实是对数据的记录: 元组中的每个元素都存放了记录中一个字段的数据, 外加这个字段的位置
      tuple_name=(num,str,num,,……) //任意python的对象,对象可混合使用
      tuple_name= tuple([num,str,num,,……])

      注:如果可能,能用tuple代替list就尽量用tuple,更安全

        tuple只有一个元素时:(num,)//否则小括号被当成运算符

    tuple_name[:]切片操作同字符串 //输出带(,,)且只有输出为一个元素是会在其后有一个

    7.2.2、元组拆包:

  • 可以应用到任何可迭代对象上, 唯一的硬性要求是, 被可迭代对象中的元素数量必须要跟接受这些元素的元组的空档数一致。 除非我们用 * 来表示忽略多余的元素
  • 最好辨认的元组拆包形式就是平行赋值, 也就是说把一个可迭代对象里的元素, 一并赋值到由对应的变量组成的元组中
  • 在平行赋值中, * 前缀只能用在一个变量名前面, 但是这个变量可以出现在赋值表达式的任意位置
  • 接受表达式的元组可以是嵌套式的
  • 在进行拆包的时候, 我们不总是对元组里所有的数据都感兴趣, _ 占位符能帮助处理这种情况。在国际化软件中, 那么 _ 可能就不是一个理想的占位符

  6.3、字典:Dictionaries dict 无序,不重复

    6.3.1、创建字典:
      name={key1:value1,key2:value2……}
      name = dict()
      dict = dict.fromkeys([key1,key2,key3.....] ,value )
        value为所有keyn的共同值,value改所有都改

      注:

      使用for key, value in dict_name:搜索:无论dict多少项所花时间一样
      可调用sorted()进行按键值对dict的排序
      字典的键值不可以为dic和list,但可用元组
         原因:字典的键值是通过哈希方法查找,键值必须不同,但dict和list是可变的,若键值改变则同一键值对应两个不同的值,或无法查找

    6.3.2、赋值:

    dict[key1]=value1
    若key为List:print(name[key][下标])
    len(字典):字典长度

    6.3.3、操作   

      检测key存在:#if 'str'in di      

      #dic.get(key) //存在返value,不存在返None      

      #dic.get(key,num)//存在返value,不存在返num    

      

添加元素

 

查询元素

 

dict[new_key]=newvalue

 

dict.keys()

 

返回dict的所有key值

dict.setfault('key',value)

原dict中有value则不修改原有key且返回value值.若无则添加key和value

    

dict.values()

返回dict的所有value值

 

 

 

 dict.items()

返回dict的所有值

删除元素

 

修改元素

 

.clear()

清空

dict1.update(dict2)  

将带dict2添加到dict1中,若有重复则该key值被覆盖

.pop(key)

删除key和value

 

 

.popitem()

     

随机删除某组key和value

del dict[key]

删某组key和value

    特点:
        查找和插入的速度极快,不会随着key的增加而变慢;
        需要占用大量的内存,内存浪费多。

    按顺序遍历字典中的所有键
      for key in soted(dic_name.keys()):

    遍历字典中的所有值且无重复值
       for value in set(dic_name.values())):

    嵌套:创建一个列表再存入n个字典

  • ·字典中存入列表
  • ·字典中存入字典

  
    
一组key的集合,但不存储value。由于key不能重复,常用于对数据的去重
    s=set(【list/tuple/dic】|string) //重复元素忽略,dic也可但只返回key,对象可混合使用
    参数为一个,当为字符串时则每个字符被分开存储

    

求并

求交

是否相同

是否包含在set1 ,父集

.union(set1)

.intersection(set2)

set1==set2

.issuperset()

set1|set2

set1&set2

 

set1>set2

求差

对称差集(A-B)交(B-A)

是否包含在set2,子集

 

.difference(set2)

.symmetric_difference(set2)

.issubset()

 

set1 - set2

set1 ^ set2

set1<set2

 

update([list/tuple/dict])

保留原来元素并添加多个元素重复元素忽略,dic也可但只返回key,对象可混合使用参数为一个,当为字符串时则每个字符被分开存储

add(key)

添加元素

.remove(key)

删除元素,删除所有元素时,对象不存在

.clear() //清空,但对象存在

 

 .pop() //随机删除

 

     6.4、列表推导(list comprehension|listcomps):构建列表(list)的快捷方式

      注:
        只用列表推导来创建新的列表,并且尽量保持简短。 如果列表推导的代码超过了两行, 你可能就要考虑是不是得用for循环重写了
        列表推导不会再有变量泄漏的问题
        Python 2.x 中, 在列表推导中 for关键词之后的赋值操作可能会影响列表推导上下文中的同名变量

生成器表达式(generator expression|genexps):用来创建其他任何类型的序列(节省内存)

 

八、序列

  • 容器序列:list、 tuple 和 collections. deque

  这些序列能存放不同类型的数据。存放的是它们所包含的任意类型的对象的引用

  • 扁平序列:str、 bytes、 bytearray、 memoryview 和 array. array,

  这类序列只能容纳一种类型。存放的是值而不是引用,是一段连续的内存空间

  • 可变序列:list、 bytearray、 array. array、 collections. deque 和memoryview。
  • 不可变序列:tuple、 str 和 bytes。

 

 

posted @ 2018-03-03 14:12  Stranger115  阅读(316)  评论(0)    收藏  举报