目录

  • Python介绍
  • Python基础知识
  • 输入输出
  • 算数运算符
  • 分支结构
  • 循环结构
  • 列表
  • 元组
  • 字典
  • 函数
  • 正则表达式
  • 面向对象


Python介绍

免费Python在线编译 python在线编译器菜鸟教程_python

  • 解释型语言 : 解释型语言编写的程序不可以进行预编译,以文本方式存储代码,会将代码一句一句直接运行。在发布程序时,看起来省了道编译工序,但是在运行程序时候,必须先解释再运行。如python
  • 编译型语言:程序在执行之前需要一个专门的编译过程,把程序编译成机械语言的文件,运行时不需要重新编译,直接使用编译结果就行了,程序执行效率高,依赖编译器,跨平台性差。如C,C++

Python基础知识

#单行注释
""" 
多行注释 
"""
#!/usr/bin/python
 print("Hello, World!")

关于脚本第一行的 #!/usr/bin/python 的解释,相信很多不熟悉 Linux 系统的同学需要普及这个知识,脚本语言的第一行,只对 Linux/Unix 用户适用,用来指定本脚本用什么解释器来执行。
有这句的,加上执行权限后,可以直接用 ./ 执行,不然会出错,因为找不到 python 解释器。
#!/usr/bin/python 是告诉操作系统执行这个脚本的时候,调用 /usr/bin 下的 python 解释器。
#!/usr/bin/env python 这种用法是为了防止操作系统用户没有将 python 装在默认的 /usr/bin 路径里。当系统看到这一行的时候,首先会到 env 设置里查找 python 的安装路径,再调用对应路径下的解释器程序完成操作。
#!/usr/bin/python 相当于写死了 python 路径。
#!/usr/bin/env python 会去环境设置寻找 python 目录,可以增强代码的可移植性,推荐这种写法。
分成两种情况:
(1)如果调用 python 脚本时,使用:

python script.py

#!/usr/bin/python 被忽略,等同于注释

(2)如果调用python脚本时,使用:

./script.py
输入输出

print的基本用法

print(value, ..., sep=' ', end='\n', file=sys.stdout, flush=False)

可以看到,print的参数为以下几项:

  • value, …:要打印的值, 以逗号分隔。
  • sep:分隔符,默认以空格分隔(打印的每项之间以空格分开)。
  • end:结束符, 默认为换行符(print默认会换行)。
  • file:打印的目的对象,默认为标准输出(可以改为其他的类似文件的对象)。
  • flush:是否立即输出到file指定的流对象中。

(1) 数据类型
value可以是不同的数据类型,通过逗号将各数据项分开。

>>> print("Hello World!", "2018/11/18", 3.14)
Hello World! 2018/11/18 3.14

(2) 更改分隔符
从上一个例子可以看出,输出的各项以空格进行分隔。更改seq值可以更改分隔符类型,如下:

>>> print("Hello World!", "2018/11/18", 3.14, sep='#')
Hello World!#2018/11/18#3.14

(3) 更改结束符
下面这个例子:

>>> print("Hello World!")
... print("Hello World!")
Hello World!
Hello World!

可以看出,print默认以换行符结束。这里可以通过更改end值更改结束符,如下:

>>> print("Hello World!", end=' ')
... print("Hello World!", end=' ')
Hello World! Hello World!

(4) 更改输出位置
print默认输出到标准输出,我们可以通过file参数来更改输出,如下:

f=open("out.txt", "w")
print("Hello World!", file=f)
f.close()

这里更改输出为out.txt,打开out.txt文件可以看到里面的内容为Hello World!.
值得注意的是,print是不会立即输出到out.txt文件中的,它将要打印的数据保留再缓冲区,当执行到f.close()时才将数据写入文件中。如果需要立即打印到文件中,将flush参数改为true即可。
(6)使用占位符

print ("Name:%10s Age:%8d Height:%8.2f"%("Aviad",25,1.83))

input的基本用法

input(prompt=None, /)

可以看出,input从标准输入读取一个字符串,并去掉最后的换行符。此外,input的prompt参数可同于打印提示信息。注意这里读取的任何内容都会被转换为字符串。

>>> a=input("Input:")
Input:Hello World!
>>> type(a)
<class 'str'>
>>> b=input("Input:")
Input:123
>>> type(b)
<class 'str'>

如果需要读取整数,利用int进行强制转换即可:

>>> c=int(input("Input:"))
Input:123
>>> type(c)
<class 'int'>
算数运算符

免费Python在线编译 python在线编译器菜鸟教程_ubuntu_02

分支结构
# 分支结构模板
if 条件 :
	condition
elif 条件:
	condition
else:
 	condition
循环结构

for循环

for 变量 in 序列:
	语句
else:
	语句
for i in range(0,10) :
    print (i,end=" ")
else :
    print("end")
#0 1 2 3 4 5 6 7 8 9 end

注意else语句只有在for循环正常退出时执行

for i in range(0,10) :
    print (i,end=" ")
    break
else :
    print("end")
# 0

while循环

while 条件表达式:
    语句块1
else:
    语句块2
列表

序列是Python中最基本的数据结构。序列中的每个元素都分配一个数字 - 它的位置,或索引,第一个索引是0,第二个索引是1,依此类推。
序列都可以进行的操作包括索引,切片,加,乘,检查成员。
列表是最常用的Python数据类型,它可以作为一个方括号内的逗号分隔值出现。
列表的数据项不需要具有相同的类型。

序号

函数

1

cmp(list1, list2) 比较两个列表的元素

2

len(list) 列表元素个数

3

max(list) 返回列表元素最大值

4

min(list) 返回列表元素最小值

5

list(seq) 将元组转换为列表

序号

方法

1

list.append(obj) 在列表末尾添加新的对象

2

list.count(obj) 统计某个元素在列表中出现的次数

3

list.extend(seq) 在列表末尾一次性追加另一个序列中的多个值(用新列表扩展原来的列表)

4

list.index(obj) 从列表中找出某个值第一个匹配项的索引位置

5

list.insert(index, obj) 将对象插入列表的index位置

6

list.pop([index=-1]) 移除列表中的一个元素(默认最后一个元素),并且返回该元素的值

7

list.remove(obj) 移除列表中某个值的第一个匹配项

8

list.reverse() 反向列表中元素

9

list.sort(cmp=None, key=None, reverse=False) 对原列表进行排序

访问列表中的值

list1 = ['physics', 'chemistry', 1997, 2000]
list2 = [1, 2, 3, 4, 5, 6, 7 ]
 
print ("list1[0]: ", list1[0])
print ("list2: ", list2[1:-1:2])
#list1[0]:  physics
#list2:  [2, 4, 6]

列表的插入

list_a = [0,1,2,3,4]
list_b = [5,6,7,8,9]
print("list_a=%s" % str(list_a))
list_a.append(2.3)
print("list_a=" +  str(list_a))
#list_a=[0, 1, 2, 3, 4]
#list_a=[0, 1, 2, 3, 4, 2.3]
#-------------------------------------------------
list_a = [0,1,2,3,4]
list_a.insert(6,250)
print("list_a=" +  str(list_a))
#list_a=[0, 1, 2, 3, 4, 250]
#------------------------------------------------
list_a = [0,1,2,3,4]
list_b = [5,6,7,8,9]
list_b.extend(list_a)
print("list_b=" +  str(list_b))
#list_b=[5, 6, 7, 8, 9, 0, 1, 2, 3, 4]

列表的删除

list1 = ['physics', 'chemistry', 1997, 2000]
print (list1)
del list1[2]
print ("After deleting value at index 2 : ")
print (list1)
#['physics', 'chemistry', 1997, 2000]
#After deleting value at index 2 : 
#['physics', 'chemistry', 2000]
#----------------------------------------------
list1 = ['physics', 'chemistry', 1997, 2000]
print (list1)
list1.pop(0)
print ("After deleting value at index 2 : ")
print (list1)
#['physics', 'chemistry', 1997, 2000]
#After deleting value at index 2 : 
#['chemistry', 1997, 2000]

列表的排序

list_a = [2,1,-1,6,9]
list_b = sorted(list_a,reverse=False)
print("list_a = ",list_a)
print("list_b = ",list_b)
list_a.sort(reverse=True)
print("list_a = ",list_a)
#list_a =  [2, 1, -1, 6, 9]
#list_b =  [-1, 1, 2, 6, 9]
#list_a =  [9, 6, 2, 1, -1]
元组

Python的元组与列表类似,不同之处在于元组的元素不能修改。
元组使用小括号,列表使用方括号。
元组创建很简单,只需要在括号中添加元素,并使用逗号隔开即可。
因为元组不能修改所以没有插入删除操作

tup = (1, 2, 3, 4, 5 )
#元组中只包含一个元素时,需要在元素后面添加逗号
tup1 = (50,)
#声明一个空元组
tup2 = ()
tup3 = tuple()
字典

字典是另一种可变容器模型,且可存储任意类型对象。
字典的每个键值(key=>value)对用冒号(:)分割,每个对之间用逗号(,)分割,整个字典包括在花括号({})中 ,格式如下所示:

d = {key1 : value1, key2 : value2 }

键必须是唯一的,但值则不必。
值可以取任何数据类型,但键必须是不可变的,如字符串,数字或元组。
键必须不可变,所以可以用数字,字符串或元组充当,而用列表就不行

dict_a = dict()
dict_b = dict()

删除字典元素

dict = {'Name': 'Runoob', 'Age': 7, 'Class': 'First'}

del dict['Name']  # 删除键 'Name'
#dict.clear()  # 清空字典
#del dict  # 删除字典
dict.pop("Age")

print("dict=", dict)

排序

# sorted(可迭代对象,key=函数名,reverse=False/True)

序号

函数及描述

1

radiansdict.clear() 删除字典内所有元素

2

radiansdict.copy() 返回一个字典的浅复制

3

radiansdict.fromkeys() 创建一个新字典,以序列seq中元素做字典的键,val为字典所有键对应的初始值

4

radiansdict.get(key, default=None) 返回指定键的值,如果值不在字典中返回default值

5

key in dict 如果键在字典dict里返回true,否则返回false

6

radiansdict.items() 以列表返回可遍历的(键, 值) 元组数组

7

radiansdict.keys() 返回一个迭代器,可以使用 list() 来转换为列表

8

radiansdict.setdefault(key, default=None) 和get()类似, 但如果键不存在于字典中,将会添加键并将值设为default

9

radiansdict.update(dict2) 把字典dict2的键/值对更新到dict里

10

radiansdict.values() 返回一个迭代器,可以使用 list() 来转换为列表

11

pop(key[,default]) 删除字典给定键 key 所对应的值,返回值为被删除的值。key值必须给出。 否则,返回default值。

12

popitem() 随机返回并删除字典中的最后一对键和值

dict_a = {'Name': 'Runoob', 'Age': 7, 'Class': 'First'}
for x,y in dict_a.items():
	print("key=%s,value=%s" % (str(x),str(y)))
format_dict="%(year)d-%(month)d-%(day)d"
list_c = [{	"year":1998,
			"month":12,
			"day":12},
			{"year":2000,
			"month":11,
			"day":11}]
for data in list_c:
	print (format_dict  % (data))
#1998-12-12
#2000-11-11
函数
def 函数名(参数列表):
    函数体

例:

def func():
	pass
def printpeople(name,age,height=170):
	print("%s 's age=%s, height=%s" %(name,age,height))
printpeople("LCX","20","180")
printpeople("YXL","21")
#LCX 's age=20, height=180
#YXL 's age=21, height=170
  • 函数代码块以 def 关键词开头,后接函数标识符名称和圆括号()。
  • 任何传入参数和自变量必须放在圆括号中间。圆括号之间可以用于定义参数。
  • 函数的第一行语句可以选择性地使用文档字符串—用于存放函数说明。
  • 函数内容以冒号起始,并且缩进。
  • return [表达式] 结束函数,选择性地返回一个值给调用方。不带表达式的return相当于返回 None。
def functionname( parameters ):
   "函数_文档字符串"
   function_suite
   return [expression]

可更改(mutable)与不可更改(immutable)对象
在 python 中,strings, tuples, 和 numbers 是不可更改的对象,而 list,dict 等则是可以修改的对象。

  • 不可变类型:变量赋值 a=5 后再赋值 a=10,这里实际是新生成一个 int 值对象 10,再让 a 指向它,而 5 被丢弃,不是改变a的值,相当于新生成了a。
  • 可变类型:变量赋值 la=[1,2,3,4] 后再赋值 la[2]=5 则是将 list la 的第三个元素值更改,本身la没有动,只是其内部的一部分值被修改了。

python 函数的参数传递:

  • 不可变类型:类似 c++ 的值传递,如 整数、字符串、元组。如fun(a),传递的只是a的值,没有影响a对象本身。比如在 fun(a)内部修改 a 的值,只是修改另一个复制的对象,不会影响 a 本身。
  • 可变类型:类似 c++ 的引用传递,如列表,字典。如 fun(la),则是将 la 真正的传过去,修改后fun外部的la也会受影响

python 中一切都是对象,严格意义我们不能说值传递还是引用传递,我们应该说传不可变对象和传可变对象。

传不可变类型

def ChangeInt( a ):
    a = 10
 
b = 2
ChangeInt(b)
print b 
# 结果是 2

传可变类型:

def changeme( mylist ):
   "修改传入的列表"
   mylist.append([1,2,3,4])
   print "函数内取值: ", mylist
   return
mylist = [10,20,30]
changeme( mylist )
print "函数外取值: ", mylist
#函数内取值:  [10, 20, 30, [1, 2, 3, 4]]
#函数外取值:  [10, 20, 30, [1, 2, 3, 4]]

参数

  • 必备参数:必备参数须以正确的顺序传入函数。调用时的数量必须和声明时的一样
  • 关键字参数:关键字参数和函数调用关系紧密,函数调用使用关键字参数来确定传入的参数值。
  • 默认参数:调用函数时,默认参数的值如果没有传入,则被认为是默认值。
  • 不定长参数:要一个函数能处理比当初声明时更多的参数。这些参数叫做不定长参数。

不定长参数
一:参数带一个星号 *基本语法如下:

#加了星号(*)的变量名以元组(tuple)的形式导入存放所有未命名的变量参数。。
def functionname([formal_args,] *var_args_tuple ):
   "函数_文档字符串"
   function_suite
   return [expression]

例:

def printinfo( arg1, *vartuple ):
   "打印任何传入的参数"
   print ("输出: ")
   print (arg1)
   print (vartuple)
   print ("总:",vartuple)
# 调用printinfo 函数
printinfo( 1, 2, 3, 4 )
#输出
#1
#2
#3
#4
#总: (2, 3, 4)

二:参数带两个星号 **基本语法如下:

#加了两个星号 ** 的参数会以字典的形式导入。
def functionname([formal_args,] **var_args_dict ):
   "函数_文档字符串"
   function_suite
   return [expression]

例:

def printinfo( arg1, **vardict ):
   "打印任何传入的参数"
   print ("输出: ")
   print (arg1)
   print (vardict)
 
# 调用printinfo 函数
printinfo(1, a=2,b=3)
#输出: 
#1
#{'a': 2, 'b': 3}

匿名函数
python 使用 lambda 来创建匿名函数。
所谓匿名,意即不再使用 def 语句这样标准的形式定义一个函数。

  • lambda 只是一个表达式,函数体比 def 简单很多。
  • lambda的主体是一个表达式,而不是一个代码块。仅仅能在lambda表达式中封装有限的逻辑进去。
  • lambda 函数拥有自己的命名空间,且不能访问自己参数列表之外或全局命名空间里的参数。
  • 虽然lambda函数看起来只能写一行,却不等同于C或C++的内联函数,后者的目的是调用小函数时不占用栈内存从而增加运行效率。
lambda [arg1 [,arg2,.....argn]]:expression

例:

sum = lambda arg1, arg2: arg1 + arg2
 
# 调用sum函数
print ("相加后的值为 : ", sum( 10, 20 ))
print ("相加后的值为 : ", sum( 20, 20 ))

强制位置参数
一个函数形参语法 / 用来指明在/符号之前函数形参必须使用指定位置参数,不能使用关键字参数的形式。单独出现星号 * 后的参数必须用关键字传入。

#形参 a 和 b 必须使用指定位置参数,c 或 d 可以是位置形参或关键字形参,而 e 或 f 要求为关键字形参:
def f(a, b, /, c, d, *, e, f):
    print(a, b, c, d, e, f)
f(10,20,30,40,e=50,f=60)
正则表达式

免费Python在线编译 python在线编译器菜鸟教程_免费Python在线编译_03


re.match函数

re.match 尝试从字符串的起始位置匹配一个模式,如果不是起始位置匹配成功的话,match()就返回none。

re.match(pattern, string, flags=0)

参数

描述

pattern

匹配的正则表达式

string

要匹配的字符串

flags

标志位,用于控制正则表达式的匹配方式,如:是否区分大小写,多行匹配等等

匹配对象方法

描述

group(num=0)

匹配的整个表达式的字符串,group() 可以一次输入多个组号,在这种情况下它将返回一个包含那些组所对应值的元组

groups()

返回一个包含所有小组字符串的元组,从 1 到 所含的小组号

import re
 
line = "Cats are smarter than dogs"
 
searchObj = re.search( r'(.*) are (.*?) .*', line, re.M|re.I)
 
if searchObj:
   print ("searchObj.group() : ", searchObj.group())
   print ("searchObj.group(1) : ", searchObj.group(1))
   print ("searchObj.group(2) : ", searchObj.group(2))
else:
   print ("Nothing found!!")
#searchObj.group() :  Cats are smarter than dogs
#searchObj.group(1) :  Cats
#searchObj.group(2) :  smarter

re.search方法
re.search 扫描整个字符串并返回第一个成功的匹配。

re.search(pattern, string, flags=0)

参数同上
re.match与re.search的区别
re.match 只匹配字符串的开始,如果字符串开始不符合正则表达式,则匹配失败,函数返回 None,而 re.search 匹配整个字符串,直到找到一个匹配。
compile 函数
compile 函数用于编译正则表达式,生成一个正则表达式( Pattern )对象

re.compile(pattern[, flags])

参数

描述

pattern

一个字符串形式的正则表达式

flags 可选

表示匹配模式,比如忽略大小写,多行模式等

免费Python在线编译 python在线编译器菜鸟教程_元组_04

>>>import re
>>> pattern = re.compile(r'\d+')                    # 用于匹配至少一个数字
>>> m = pattern.match('one12twothree34four')        # 查找头部,没有匹配
>>> print( m )
None
>>> m = pattern.match('one12twothree34four', 2, 10) # 从'e'的位置开始匹配,没有匹配
>>> print( m )
None
>>> m = pattern.match('one12twothree34four', 3, 10) # 从'1'的位置开始匹配,正好匹配
>>> print( m )                                        # 返回一个 Match 对象
<_sre.SRE_Match object at 0x10a42aac0>
>>> m.group(0)   # 可省略 0
'12'
>>> m.start(0)   # 可省略 0
3
>>> m.end(0)     # 可省略 0
5
>>> m.span(0)    # 可省略 0
(3, 5)

findall
在字符串中找到正则表达式所匹配的所有子串,并返回一个列表,如果没有找到匹配的,则返回空列表。

re.findall(string[, pos[, endpos]])

参数

描述

string

待匹配的字符串

pos

可选参数,指定字符串的起始位置,默认为 0

endpos

可选参数,指定字符串的结束位置,默认为字符串的长度

import re
 
pattern = re.compile(r'\d+')   # 查找数字
result1 = pattern.findall('runoob 123 google 456')
result2 = pattern.findall('run88oob123google456', 0, 10)
 
print(result1)
print(result2)
#['123', '456']
#['88', '12']