python学习 - 记录了部分知识点

运行: python test.py

输出: print(变量); 如print(1+2), print("1+2")

字符串可以用单引号也可以用双引号。单引号包围的字符串可以包含双引号,双引号包含的字符串可以包含单引号。

r'内容'  表示内容里面的\不被转义

'''内容

内容'" 表示可以支持换行的字符串

r和'''可以组合使用。

布尔值 True False注意大小写 and is or not 都是运算符.

None空值

除法: int / int = float; 10 // 3 = 1;  -10 // 3 = -4. 下取整. -10 % 3 = 2 余数与符号有关.

Python的整数没有大小限制,而某些语言的整数根据其存储长度是有大小限制的,例如Java对32位整数的范围限制在-2147483648-2147483647

Python的浮点数也没有大小限制,但是超出一定范围就直接表示为inf(无限大)

编码: 内存中统一使用Unicode编码. Unicode编码是2或4字节表示一个字符. 写入文件用UTF-8编码, UTF-8是1-6字节, 变长的.

Unicode是用双引号写的字符串, UTF-8等其它编码是类似b"内容"的字符串

各种编码转换方式

ord('A')将字符转int(应该是Unicode), chr(25991)将int转字符(同Unicode)

变成utf-8之后中文字符会占三个字节因为前面多了一个\

'Hi, %s' % True 输出 Hi, True

'Hi, %s is %d years old' % ('xiaoming', 5) 输出 小明5岁了

[类似C#的输出方式]print('Hi, {0}, {1:.3f}'.format(True, 5.201314)) 输出 Hi, True, 5.201

List 有序数组, 变长. 支持append追加到末尾, insert(1, "元素")插入到第一个位置,  pop()删除末尾, pop(i)删除第i个元素, a[1] = 'Sarah', 直接替换某元素

list元素可以嵌套

tuple元素, 不可修改. 

if <条件判断1>:
    <执行1>
elif <条件判断2>:
    <执行2>
elif <条件判断3>:
    <执行3>
else:
    <执行4>

if判断条件还可以简写,比如写:

if x:
    print('True')

只要x是非零数值、非空字符串、非空list等,就判断为True,否则为False

包含了基本读取 转换为int 和判断

s = input('birth: ')
birth = int(s)
if birth < 2000:
    print('00前')
else:
    print('00后')
list(range(100)) 
# range(100)生成一个range类型的对象, 再用本range构造一个list

Dict(映射)

# 创建和访问
d = {"Michael": 95, 'Bob': 75, 'Tracy': 85}
print(d['Michael'])
d['ixs']=25
print(d['ixs'])

要避免key不存在的错误,有两种办法,一是通过in判断key是否存在:

if 'Key' in d:

二是通过dict提供的get()方法,如果key不存在,可以返回None,或者自己指定的value:

#get和中括号访问的区别
d.get('Thomas')        # 不存在返回None
d.get('Thomas', -1)    # 不存在返回-1

 dict占用大量的内存空间, 速度快; list随着元素增加速度变慢, 比较节省空间.

set有序不重复集合, 参见这里.

强制类型转换 int('123'), float("12.34"), str(100), bool(1), bool('')=False

Python函数在定义的时候,默认参数L的值就被计算出来了. 所以如果默认参数指向了变量,后面对此参数的操作都是对同一个变量的操作

变长参数

def calc(*numbers):
    sum = 0
    for n in numbers:
        sum = sum + n * n
    return sum

切片(取子数列)是个很常见的操作, 地址>>>

list类型的迭代是很普通的foreach; dict类型的迭代有些特殊, 是

默认情况下,dict迭代的是key。如果要迭代value,可以用for value in d.values(),如果要同时迭代key和value,可以用for k, v in d.items()

 L2 = [x.lower() for x in L if isinstance(x, str)] # 理解为for .. in L: if CONDITION: return ..

把中括号改成小括号就变成迭代器类型了. 迭代器也是Iterable的. 迭代器在访问元素的时候才计算该元素, 所以占内存小.

高阶函数: (在Python 3中好像都是惰性的, 在Python 2中好像不是)

map: 对List的每个元素进行操作, 返回一个List

reduce: 依次对List的前两个元素进行操作, 返回一个数

filter: 对List的每个元素进行判断决定是否保留, 返回一个List

sorted: 对List的元素进行排序, 按照一定规则. 返回一个List

返回函数就是函数作为返回值. 这就是惰性函数的实现方式.

  • 注意到返回的函数在其定义内部引用了局部变量args,所以,当一个函数返回了一个函数后,其内部的局部变量还被新函数引用,
  • 返回闭包时牢记一点:返回函数不要引用任何循环变量,或者后续会发生变化的变量。

匿名函数 lambda [参数]: 返回值

装饰器: 重写(override)函数的一种方法. 定义一个以函数为参数的函数, 并返回一个Wrapper函数 wrapper(*args, **kw)

  • 最典型的一行代码: 
        def wrapper(*args, **kw):

偏函数: 为函数的部分参数指定值, 并创建一个指向此函数的变量

在Python中,一个.py文件就称之为一个模块(Module)。

被执行的文件的__name__会被命名为main, 而用Import导入时则不会

安装模块: 

我们推荐直接使用Anaconda,这是一个基于Python的数据处理和科学计算平台,它已经内置了许多非常有用的第三方库,我们装上Anaconda,就相当于把数十个第三方模块自动安装好了,非常简单易用。

 我现在搞不清的是类与模块在导入时的区别,究竟谁才是主要部分

from 文件名 import 类名

面向对象编程

这就是动态语言的“鸭子类型”,它并不要求严格的继承体系,一个对象只要“看起来像鸭子,走起路来像鸭子”,那它就可以被看做是鸭子。

Python的“file-like object“就是一种鸭子类型。对真正的文件对象,它有一个read()方法,返回其内容。但是,许多对象,只要有read()方法,都被视为“file-like object“。许多函数接收的参数就是“file-like object“,你不一定要传入真正的文件对象,完全可以传入任何实现了read()方法的对象。

 继承一个类用Class Son(Parent):  基类是object注意o小写

type判断一个对象的类型  isintance()可以用于继承关系. 能用type判断的都能用Isinstance()判断

has attr(), getattr(obj, 'z', 默认值) 获取对象信息

python中的类属性像静态成员变量, 属于类不属于对象 但是Python的动态语言特性导致给对象.变量赋值时会给对象增加自身的属性

python的动态语言特性 甚至可以给变量添加方法. 可以用__slot__指定允许的变量

python可以像C#那样设置getter和setter这个东西是@property 和 @变量.setter

>> 已跳过面向对象高级编程中Python的多重继承后面的内容

>> 继续单元测试

猜你喜欢

转载自blog.csdn.net/u010099177/article/details/83039358