python的学习
来源:互联网 发布:单片机原理及 编辑:程序博客网 时间:2024/06/11 07:27
- python的学习
- python基础
- 数据类型和变量
- 整数
- 浮点数
- 字符串
- 布尔值
- 空值
- 变量
- 常量
- 字符串和编码
- 格式化
- 使用list和tuple
- tuple
- 添加判断
- 循环
- 使用dict和set
- 数据类型和变量
- 函数
- 调用函数
- 定义函数
- 参数检查
- 返回多个值
- 函数的参数
- 默认参数
- 可变参数
- 关键字参数
- 命令关键字参数
- 参数组合
- 递归函数
- 高级特性
- 切片
- 迭代
- 列表生成式
- 生成器
- python基础
python的学习
python的学习,我这次条理不会非常清晰,只是记录一些自己感兴趣的部分。
- name =input() python等待你的输入。
- 当语句以冒号:结尾时,缩进的语句视为代码块
- print()会一次打印每个字符串,遇到逗号“,”会输出空格,因此,输出的字符串是这样拼起来的:
print(’The quick brown fox’,’jumps over’,’the lazy doy’)
python基础
数据类型和变量
整数
浮点数
字符串
字符串是以单引号’或双引号”括起来的任意文本。
如果字符串内部既包含’有包含”怎么办?可以用转义字符\来标识,比如
‘i\’m \”OK\”!’ ==>I’m “OK”!
转义字符\可以转义很多字符,比如\n表示换行,\t表示制表符,
Python还允许用r‘’表示‘’内部的字符串默认不转义。
Python允许用’’’…’’’的格式表示多行内容。
布尔值
True False 布尔值可以用and、or和not运算
if age>=18: print(‘adult’)else: print(‘teenager’)
空值
None
变量
变量在程序中就是用一个变量名表示了,变量名必须是大小写英文、数字和_的组合,且不能用数字开头
常量
所谓常量就是不能变的变量,在Python中,通常用全部大写的变量名表示常量
python中,有两种出发,一种除法/
/除法计算结构是浮点数,即使是两个整数恰好整除,结果也是浮点数:
还有一种除法//,称为地板除,两个整数的除法仍然是整数:
字符串和编码
对于耽搁字符的编码,Python提供了ord()的函数获取字符的整数表示,chr()函数把编码转换为对应的字符。
由于python的字符串类型是str,在内存中以Unicode表示,一个字符对应若干个字节。如果要在网络上传输,或者保持在磁盘上,就需要把str变为以字节为单位的bytes。
python对bytes类型的数据用带b前缀的单引号或双引号表示。
要计算str包含多少个字符,可以用len()函数
当操作字符串时,我们经常遇到str和bytes的互相转换。为了避免乱码问题,应对始终坚持使用utf-8编码对str和bytes进行转换。
#!/usr/bin/python# -*- coding: utf-8 -*-
格式化
print ('hello, %s' % 'world')print ('Hi,%s,you have %d.' % ('Michael', 10000))
常见的占位符:
使用list和tuple
当索引超出了范围是,python会报一个indexError错误,所以,要确保索引不要越界,记得最后一个元素的所有-1,还可以用-1做索引,直接获得最后一个元素。
可以获得倒数第二个、倒数第三个:
classmates[-2],calssmate[-3].
list是一个可变的有序表,所以,可以往list中追加元素到末尾:
classmates.append(‘Adam’) classmates.insert(1,’jack’)
要删除指定位置的元素,用pop(i)方法。删除最后一个直接用pop方法。
要把某个元素替换别的元素,可以直接赋值对应的索引位置。
list里面的元素的数据类型也可以不同。
tuple
tuple一旦初始化就不能修改。
classmates=(’tony’,’lvy’,’homer’)
现在,这个tuple不能变了,它也没有append(),insert()这样的方法。其它获取元素的方法和list是一样的,你可以正常使用classmate.
所以,只有1个元素的tuple定义时必须加一个逗号,,来消除歧义:
t=(1,)
添加判断
ifelifelse
再议input
a=input(‘birth:s’)s=int(a)
循环
classmates = ['tony', 'homer', 'ivy']for name in classmates: print name
如果要计算1-100的整数之和,从1写到100有点困难,幸好python提供一个range()函数,可以生产一个整数序列,再通过list()函数可以转化。
sum1 = 0for x in range(101): sum1 = sum1 + xprint sum1
第二种循环
sum1=0n=99while n>0: sum1=sum1+n n=n-2print (sum1)
break
contine
使用dict和set
python内置了字典:dict的支持,dict全程dictionary,其它言语中也称为map,使用key-value存储,具有极快的查找速度。
d = {'homer': 25, 'ivy': 21, 'tony': 18}print (d['homer'])
把数据放入dict的方法。
d['biwu'] = 32print(d)
避免key不存在的错误,有两种方法,一是通过in判断key是否存在:
print ('Thomas' in d)print (d.get('Thomas', -1))
删除一个key,用pop(key)方法。
要保证hash的正确性,作为key的对象就不能变。在python中,字符串、整数灯都是不可变的,因此,可以放心地作为key。而list是可变的,就不能作为key:
set
s = set([1, 2, 3, 4, 1, 3, 4])print (s)s.add(5)print (s)s.remove(1)print s
再议不可变对象
函数
调用函数
定义函数
在python中,定义一个函数要使用def语句,依次写出函数名、括号、括号中的参数和冒号:,然后,在缩进块中编写函数体,函数的返回值用return语句返回。
def my_abs(x): if x>=0 : return x else: return -x
如果你已经把my_abs()的函数定义保存为abstest.py文件了,那么,可以在该文件的当前目录下启动python解释器,用from abstest import my_abs来导入my_abs()函数,注意abstest是文件名。
pass语句什么都不做,那有什么用?实际上pass可以用来作为占位符,比如现在还没有想好怎么写函数的代码,就可以先放一个pass,让代码能运行起来。
参数检查
让我们修改一下my_abs的定义,对参数类型做检查,只允许整数和浮点数类型的参数。数据类检查可以用内置函数isinstance()实现:
def my_abs(x): if not isinstance(x,(int,float)): raise TypeEroor(‘bad operand type’) if x>0: return x else: return -x
返回多个值
import mathdef move(x,y,step,angle=0): nx=x+step*math.cos(angle) ny=y-step*math.sin(angle) return nx,ny
原来返回值是一个tuple,在语法上,返回一个tuple可以省略括号,而多个变量可以同时接受一个tuple,按位置赋给对应的值。
函数的参数
默认参数
新的power(x,n)函数定义没有问题,但是,就的调用代码失败了,调用函数时,传入的两个值按照位置顺序依次赋给参数x和n。
设置默认参数是,有几点要注意:
- 是必选参数在前面,默认参数在后,否则pyton的解释器会报错。
- 如何是指默认参数
当函数有多个参数时,把变化大的参数放亲们,变化小额参数放后面。变化晓得额参数就可以作为默认参数。
原因解释如下:
python函数在定义的时候,默认参数L的值就被计算出来了,即[],因为默认参数L也是一个变量,它指向对象[],每次调用该函数,如果改变了L的内容,则下次调用时,默认参数的内容就变了,不再是函数定义时的[]了。
def add_end(L=None) if L is None: L=[] L.append(‘END’) return L
为什么要设计str、None这样的不变对象呢?因为不变对象一旦创建,对象内部的数据就不能修改,这样就减少了由于修改数据导致的错误。此外,由于对象不变,多任务环境下同事读取对象不需要加锁,同事读一点问题都没有。我们在编写程序时,如果可以设计一个不变对象,就尽量设计成不变对象。
可变参数
- 由于参数个数不确定,我们首先想到可以把a,b,c…作为一个list或tuple传进来,这样,函数可以定义如下:
- 我们就把函数的参数改为可变参数:
def calc(*numbers): sum=0 for n in numbers: sum=sum+n*n return sum
这种写法当然是可行的,问题是太繁琐,所以python允许你在list或tuple前面加一个*号,把list或tuple的元素变成可变元素变成可变参数传入
关键字参数
和可变参数类似,也可以先组装一个dict,然后,把该dict转换为关键字参数传进入
**extra表示吧extra这个dict的所有key-value用关键字参数传入函数的**kw参数,kw将获得一个dict,注意kw获得dict是extra的一份拷贝,对kw的改动不会影响到函数外的extra。
命令关键字参数
和关键字参数**kw不同,命名关键字参数需要一个特殊分隔符*,*后面的参数被视为命令关键字参数。
def person(name,age,*,city,job) print(name,age,city,job)
如何关键字参数必须传入参数名,者和位置参数不同。如果没有传入参数名,调用将报错。
def person (name,age,*args,city,job) print(name,age,args,city,job)
参数组合
在python中定义函数,可以用必选参数、默认参数、可变参数、和命名关键字参数,这5中参数都可以组合使用。但是请注意,参数定义的顺序必须是:必选参数、默认参数、可变参数、命名关键参数和关键字参数。
def f1(a,b,c=0,*args,**kw)print(“a=”,a,”b=”,b,”c=”,c,”args=”,args,”kw”,kw) def f2(a,b,c=0,*,d,**kw)print(“a=”,a,”b=”,b,”c=”,c,”d=”,d,”kw=”,kw)
所以,对于任何函数,都可以通过类似func(*args,**kw)的形式调用它,无论它的参数是如何定义的。
递归函数
解决递归调用栈溢出的方法是通过尾递归优化,事实上尾递归和循环的效果是一样的,所以,把循环看出一种特殊的尾递归函数也是可以的。
尾递归的是指,在函数返回的时候,调用自身本身,并且,return语句不能包含表达式。这样,编译器或者解释器可以把尾递归做优化,使递归本事无论调用多少次,都只占用一个栈帧,不会出现栈溢出的情况。
高级特性
切片
取一个list或tuple的部分元素是非常常见的操作。
L[0:3]
前10个数,每两个取一个
L[:10:2]
tuple也是一种list,唯一区别是tuple不可变。因此,tuple也可以用切片操作,只是操作的结果仍是tuple。
(0,1,2,3,4,5)[:3]
迭代
可以看出,python的for循环抽象程度要高于java的for循环,只要是可迭代对象,无论有无下标,都可以迭代,比如dict就可以迭代。
默认情况下,dict迭代的是key。如果要迭代value,可以用
for value in d.values()
如果要同时迭代key和value,可以用
for k,v in d.items()
如何判断一个对象是可迭代对象?方法是通过collections模块的iterable类型判断:
from collections import Iterableisinstance(‘abc’,Iterable)
最后一个小问题,如果要对list实现类似java那样的下边循环?python内置了enumerate函数可以把一个list变成索引-元素对,这样就可以在for循环中同时迭代索引和元素本身。
上面的for循环里,同时引用了两个变量,在python里很常用的。
列表生成式
但是循环太繁琐,则列表生产式则可以用一行语句代替循环生成上面的list:
[x*x for x in range(1,11) if x%2==0]
还可以使用两层循环,可以生成全排列
[m+n for m in ‘ABC’ for n in ‘XYZ’]
因此,列表生产式也可以使用两个变量来生成list
d={‘X’:’A’,’Y’:’B’,’Z’:’C’}[k+’=’+v for k,v in d.items()]
生成器
通过列表生产式,我们可以直接创建一个列表。但是,受内存限制,列表容量肯定是有限的。而且,创建一个包含100万个元素的列表,不仅占用很大的存储空间,如果我们仅仅需要访问前面几个元素,那后面绝大多数元素占用的空间都白白浪费了。
所以,如果列表元素可以按照某种算法推算出来,那我们是否可以在循环的过程中不断算出后续的元素呢?这样就不必创建完整的list,从而节省大量的空间。在python中,这种以便循环一边计算的机制,称为生成器:generator.
要创建一个generator,有很多方法。第一种方法很简单,只要把一个列表生产式的[]改成(),就创建了一个generator:
g=(x*x for x in range(10))
当然,上面这种不断调用next(g)实在太变态了,正确的方法是使用for循环,因为generator也是可迭代对象。
python的赋值语句
a,b=b,a+b
上面的函数和generator仅一步之遥。要把flb函数变成generator,只需要把print(b)改为yield b就可以了。
者就是定义generator的另一种方法。如果一个函数定义中包含yield关键字,那么这个函数就不再是一个普通函数,而是一个generator:
这里,最难理解的就是generator和函数的执行流程不一样。函数的是顺序执行,遇到return语句或最后一行函数语句就返回。而变成generator的函数,在每次调用next()的时候,遇到yield语句返回,在执行时从上次返回的yield语句处继续执行。
但是用for循环调用generator时,发现拿不到generator的return语句的返回值。如果想要拿到返回值,必须铺货stopIeration错误,返回值包含在StopIteration
- Python学习-Python的基础知识
- python的学习
- python的twisted 学习
- Python的学习纲要
- python的学习
- python 3.2的学习
- 学习python的网站
- python学习的看法
- python序列的学习
- python datetime的学习
- 学习Python的总结
- python类的学习
- python的字典学习
- 关于Python的学习
- python的学习一
- 学习python的目的
- 学习python的初衷
- 学习python的地方
- 也算是第一次开通博客
- 地宫取宝 (dfs+dp深搜)
- UVA1640TheCountingProblem
- 练习1-2 做个实验,当printf函数的参数字符串中包含\c(其中c是上面的转义字符未曾列出的某一个字符)时,观察一下输出
- JavaScript 资源大全中文版
- python的学习
- angular4路由基础运用
- dubbo-1
- 巧妙的实现多个进程同时跑的问题~买票系统
- 小白的蚁群算法学习总结
- 你家的小程序那么优秀,快来这里进行海量曝光!小程序推广
- Python中的逻辑运算符‘and’、‘or’和‘not’
- $a=58 发生了什么?
- Java —— 正则表达式