Python 基础

Python学习

数组

array模块中定义。
array 和 list的区别:
array可以紧凑的表示一个基本值得数组(字符、整数、浮点),类似list序列,有区别:
array只能保存一种类型,初始化决定。list可以存放任何类型。如果只存放数字,array更高效。
array的数据类型

Type code Python Type size
'b''B' int 1
'u' Unicode char 2
'h''H''i' int 2
'L' int 4
'Q' int 8
'f' float 4
'd' float 8
  • 常用方法
append() #末尾添加
buffer_info() #内存信息tuple(地址,长度)
byteswap() #根据CPU架构不同,有的以小端存储(最小有效位存在小地址中)或大端(最小有效字节在最大地址中)
count() #统计给定数字重复出现的次数
extend() # 添加多个元素 数组或迭代都可以
fromfile() #从文件中读取 指定读取数量超过length报错
tofile() #写入文件对象
fromlist() #从list中添加元素
frombytes() #从bytes对象中添加元素
index()#返回第一个匹配的索引
insert()#在指定位置添加元素
pop() #移除并返回指定位置元素(缺省i=-1最后一个)
remove() #删除匹配的第一个元素
reverse()#翻转顺序
tolist() #转为list
tobytes() #转为bytes对象

#构造
from array import array
arr = array('i') #空int类型
arr = array('i',[0,1,2,3,4])
arr = array('f',[random.randrange(-10,10) for _ in range(5)])#5个随机元素
arr.typecode #'f' typecodes 返回所有可用类型
#二进制文件打开读写
with open('arr.bin','wb') as f:
  arr.tofile(f)

Python数组分为三种类型:

  1. list:普通链表,初始化后可以动态添加元素。arr=[元素]
  2. Tuple:固定数组,一旦定义长度不能修改。arr=(元素)
  3. Dictionary:词典类型,即 Hash数组。arr={元素K:V}
#append(v) insert(index,v) extend(list) lst[n] count(v) 
#pop([n=-1]) remove(v) del lst[n] 
#reverse() sort(reverse=True) 
#len(lst) max(lst) min(lst) list(tuple) 
#copylist:L1=L(地址复制)  L1=L[:](克隆另一个拷贝)
enumerate(lst) 返回 index - vlue  //for i ,v in enumerate(lst) print('index=%s value=%s' %(i,v)) 
lst = [1,2,[3,4]]
lst = []
lst = [i for i in range(10),1,[]]

数据类型

变量不需要声明,每个变量使用前必须赋值,赋值后被创建。

int、float bool complex 
String
List
Tuple
Dictionary
Set

#赋值
a = '123'
a=b=c=1
a,b,c,d=1,2.5,'123',True

#String
Str = '123456'
Str[2:4] # '345'
Str[2:] #'3456'
Str[0:-1] #'12345'
Str+'789' #'123456789'

#List
List = ['ab',1,3.2,True]  #元素可修改
tuple = ('ab',1,3.2,True)  #元素不能修改
dic={'name':'jack','age':19,3:'True'} 
dic['name']
dic[3]
#keys() values()

全局变量

函数内部定义的都是局部变量,要使用全局变量,要在函数内部的用global关键字。对于内嵌函数要用父级函数的变量要用nonlocal关键字

count=0
def modify():
  do=0
  global count  # use global var
  count= count+1
  def x():
    nonlocal do
    do=10 #use not local var

自定义函数

def 函数名(参数列表)->返回值:   #多个参数用 , 隔开
  ···
    函数文档 (一段字符串,三个单引号包围的一段文本)
  ···
  //do
  [return[返回值]]

#参数
#1 默认参数(name,age=10)
#2 可变参数,不是传入list或tuple。(* names)
def sum(* nums):  #调用sum(1,2,3,4)
  sum=0
  for n in nums:
    sum= sum+n
  return sum
#3 关键字参数,参数带名字
def x(** n):
  print(n)
  print(n['age'])

x(name='tom',age=10)
# {'name':'tom','age':10}
# 10

列表推导式

list=[exp for var in iterable if condition]
list=[n+1 for n in range(10) if n%2==0]

生成器表达式

在循环中如果基于列表而数量巨大会一次生成一个占用大量内存的列表,而循环操作每次只会用一个元素,这时可用生成器表达式,按给定的规则依次生成每个元素。
generator=(exp for var in iterable if condition)
跟列表推导式的差别:列表元素一次生成,生成器表达式随着next()的调用(隐式调用)实时生成,直到没有元素可以生成,抛出StopIteration错误。

生成器函数

除了生成器表达式可以生成generator,函数也可以生成generator,比如要生成一个平方序列square(n)
如果用return list方式,生成整个列表然后返回列表序列,会一次生成所有元素,用生成器函数更好,关键是返回用yield。

#列表方式
def square(n):
  list=[]
  for i in range(n):
    list.append(i*i)
  return list #按顺序执行完遇到return返回

#生成器函数
def square(n):
  for i in range(n):
    yield i*i  #遇到yield返回一次,下次接着执行

for x in square(10):
  print(x)

迭代器

可用于for循环的种类:

  • 集合类 str list tuple dict set : 是可迭代类型Iterable
  • 生成器 生成器表达式 和 生成器函数:是迭代器Iterator,可以被next()函数不断调用生成下一个值。
    区别:都是Iterable,后者是Iterator前者不是,前者可以用iter()函数转变为后者。
    都是可迭代对象Iterable,判断isinstance([],Iterable), isinstance((n for n in range(10)),Iterable)

高阶函数

函数名也是变量所以函数名也可以作为函数的参数。
将函数作为参数的函数称为高阶函数

def x(a,b,fun):
  return fun(a)*fun(b)
  • 内置高阶函数
    map(f, iterable):将函数f依次作用到可迭代对象上。返回值是迭代器,是惰性序列。
def f(x):
  return x*x
l=map(f,[1,2,3,4])
print(list(l))# 通过list计算迭代序列

reduce(f, iterable):将函数f依次作用到可迭代对象上。返回值是迭代器,是惰性序列。使用跟map()类似,区别是f需传入两个参数

def f(x,y):
  return x*y   #计算连乘
l=reduce(f,[1,2,3,4]) #计算顺序为f(1,2) f(2,3) f(6,4)
print(l)
#24

filter(f, iterable)`:将函数f依次作用到可迭代对象上,判断为true保留,false丢弃。返回值是迭代器,是惰性序列。

def f(x):
  return x%2==1
l=filter(f,[1,2,3,4])
print(list(l))# 通过list计算迭代序列
#[1,3]

sorted(序列, key=fun, reverse=true)

sorted(list,key=str.lower,reverse=true)

闭包closure

引用自由变量的函数。被引用的自由变量与函数一同存在,即使已经离开了创造它的函数。

  • 闭包函数必须有内嵌函数
  • 内嵌函数要引用上一级函数的变量
  • 闭包函数返回内嵌函数
def f(x):
  def ff(y):
    print(x+1+y)
   return ff

A=f(5)
B=f(2)
A(1)  #7
A(2)  #8
B(1) #4
B(3) #6
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 217,084评论 6 503
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,623评论 3 392
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 163,450评论 0 353
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,322评论 1 293
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,370评论 6 390
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,274评论 1 300
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,126评论 3 418
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,980评论 0 275
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,414评论 1 313
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,599评论 3 334
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,773评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,470评论 5 344
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,080评论 3 327
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,713评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,852评论 1 269
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,865评论 2 370
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,689评论 2 354