Python学习笔记

基本数据类型和基础语法

1. 数字:

int 123456899899

float 3.2 1.5E6

complex 1+2j

2. str 字符串 "hello"

3. list 列表 [1,2,'ok',4.3]

4. tuple 元组 (1,2,3)

5. dict 字典 {'a':20,'b':30,49:50}

一、数字

1. 整数

可以任意长,有10进制、2进制、8进制、16进制

x = int()   
x = int(17)

整数运算:

+,-,*,%,与c++同

/ 结果是浮点数

// 整数除法,与c++同
x ** y 求x的y次幂

位运算同C++,但没有符号位的问题

2. 布尔类型

常量:True, False

True = 1

False = 0

0 -> False 其他都是 True

逻辑运算符: and or not

空 str, tuple, list, dict 都是 False

3. 浮点类型

判断浮点数相等:

import sys
def equal_float(a,b):
   return abs(a-b) <= sys.float_info.epsilon
#最小浮点数间隔,32位机为 2e-16 
print(equal_float(1.0,1.0)) # True

sys.float_info

import sys
print(sys.float_info)
'''
sys.float_info(max=1.7976931348623157e+308,
   max_exp=1024, max_10_exp=308,
   min=2.2250738585072014e-308, min_exp=-1021,
   min_10_exp=-307, dig=15, mant_dig=53,
   epsilon=2.220446049250313e-16, radix=2, rounds=1)'''

浮点运算

import math
x = 123.50
print(round(x)) #不精确,如print(round(119.49999999999999999)) => 120 print(math.floor(x))
print(math.ceil(x))
print(12.3.is_integer())
print(12.00.is_integer())
s = str(14.25) #转字符串
print(s)
'''
124 
123 
124 
False 
True
14.25
'''

高精度浮点数decimal.Decimal

import decimal
from decimal import *
a = decimal.Decimal(98766)
b = decimal.Decimal("123.223232323432424244858484096781385731294")
print(b)
c = decimal.Decimal(a + b) #精度缺省为小数点后面28位
print(c)
getcontext().prec = 50 #设置精度为小数点后面50位
print(c)
c = decimal.Decimal(a + b)
print(c)
'''
123.223232323432424244858484096781385731294 
98889.22323232343242424485848 
98889.22323232343242424485848
98889.223232323432424244858484096781385731294
'''

二、字符串

1. 字符串不可修改

2. 不转义的字符串 

print(r'ab\ncd') # ab\ncd

3. 用 'a' in S, 'a' not in S判断子串'a'是否在字符串S中

4. S.count('s') 求子串's'在S中出现次数

5. len(S)求S的长度

6. S.upper(), S.lower() 转大写、小写

7. S.find(), S.rfind(), S.index(), S.rindex() 查找;找不到find 返回-1;index抛出异常

s="1234abc567abc12" 
print(s.find("ab")) # 4 
print(s.rfind("ab")) #10 
try :
    s.index("afb")
except Exception as e:
print(e) # substring not found

8. S.replace() 替换

s="1234abc567abc12"
b = s.replace("abc","ABC") 
print(b) # 1234ABC567ABC12 
print(s) # 1234abc567abc12

9. S.isdigit(), S.islower(), S.isupper() 判断是否是数,大小写等

s="1234abc567abc12" 
print(s.islower()) # Ture

10. S.startswith("abc"), S.endswith("xyz") 判断是否以某子串开头、结尾

s="1234abc567abc12" 
print(s.startswith("123")) # True

11. S.strip(), S.lstrip(), S.rstrip() 除去空白字符,包括空格, '\r' '\t' '\n'

print ( " \t12 34 \n ".strip()) # 12 34 
print ( " \t12 34 5".lstrip()) # 12 34 5

12. S.split(",") 字符串分割,返回值是一个列表

print( " \t12 34 ,ab\n ".split()) #用空格,回车,制表符分割
print( " \t12 34 ,ab,cd\n ".split(",")) #用‘,’分割
y = " \t12,.34 ,ab,.cd\n ".split(",.") #用 ",." 字符串分割 print(y[1])
print('A123AA456AA7A'.split('A'))

13. 用多个字符进行分割(re是regular expression模块)

import re
a = 'Beautiful, is; better*than\nugly' 
print(re.split(';| |,|\*|\n',a)) #分隔串用 | 隔开
# ['Beautiful', '', 'is', '', 'better', 'than', 'ugly']

14. 字符串的编码在内存中的编码是unicode的,没有字符类型

print (ord("a")) # 97
print(ord("好")) # 22909
print(chr(22900)) # 奴
print(chr(97)) # a

15. 字符串的格式化 {序号:宽度.精度.类型}

> : 右对齐

< : 左对齐

^ : 中对齐

x = "Hello {0} {1:10},you get ${2:0.4f}".format("Mr.","Jack",3.2) 
print(x) # Hello Mr. Jack ,you get $3.2000 
x = "Hello {0} {1:>10},you get ${2:0.4f}".format("Mr.","Jack",3.2) 
print(x) # Hello Mr. Jack,you get $3.2000
print("Today is %s.%d." % ('May',21)) # Today is May.21.

三、元组

1. 一个元组由数个逗号分隔的值组成,前后可加括号

2. 元组相当于C++中的 vector, 各种操作复杂度亦然。可认为是个指针数组。数组元素不可修改,不可增删元素,元素指向的东西可以修改

t = 12345, 54321, 'hello!'
print(t[0]) # 12345
print(t) # (12345, 54321, 'hello!')
u = t, (1, 2, 3, 4, 5)
print(u) #((12345, 54321, 'hello!'), (1, 2, 3, 4, 5)) 
t[0] = 88888 #元组的值不能修改,运行错误
# 元组可以包含可修改的对象
v = ("hello",[1, 2, 3], [3, 2, 1]) # [1,2,3]是列表 
v[1][0] = 'world'
print(v) # ('hello', ['world', 2, 3], [3, 2, 1]) 
print(len(v)) # 3 求长度

3. 单元素元组

empty = () #空元组
singleton = 'hello',  # <-- note trailing comma
print(len(empty)) # 0
print(len(singleton)) # 1
x = ('hello',) #无逗号则x为字符串 
print(x) # ('hello',)

4. 用下标访问元组

tup1 = ('Google', 'Runoob', 1997, 2000)
tup2 = (1, 2, 3, 4, 5, 6, 7 )
print ("tup1[0]: ", tup1[0]) #  tup1[0]: Google 
print ("tup2[1:5]: ", tup2[1:5]) # tup2[1:5]: (2, 3, 4, 5)

5. 可以对元组进行连接组合

tup1 = (12, 34.56);
tup2 = ('abc', 'xyz')
# 创建一个新的元组
tup3 = tup1 + tup2;
print (tup3) #  (12, 34.56, 'abc', 'xyz')

6. 元组运算和迭代

x = (1,2,3) * 3
print(x) # (1, 2, 3, 1, 2, 3, 1, 2, 3)
print(3 in (1,2,3)) # True
for i in (1,2,3):
print(i) 
# 1 
# 2 
# 3

7. 拷贝元组,“=”赋值是深拷贝

x = (1,2,3)
b = x
print(b is x) # true
x += (100,)
print (x) # (1, 2, 3, 100) 
print (b) # (1, 2, 3)

8. 用元组定义二维数组

matrix = ((1, 2, 3), (4, 5, 6), (7, 8, 9)) 
print(matrix) # ((1, 2, 3), (4, 5, 6), (7, 8, 9)) 
print(matrix[1][1]) # 5

 9. 元组的排序

from operator import *
students = (
            ('John', 'A', 15), # 姓名,成绩,年龄
            ('Mike', 'B', 12), 
            ('Mike', 'C', 18), 
            ('Bom', 'D', 10))
print(sorted(students,key = itemgetter(0,1)))
#[('Bom', 'D', 10), ('John', 'A', 15), ('Mike', 'B', 12), ('Mike', 'C', 18)]

五、列表

1. 列表相当于C++中的 vector,各种操作复杂度亦然。可认为是个指针数组;列表中的元素可以修改,可以增删

empty = [] #空表
list1 = ['Google', 'Runoob', 1997, 2000];
list2 = [1, 2, 3, 4, 5, 6, 7 ];
print ("list1[0]: ", list1[0]) # list1[0]: Google
print ("list2[1:5]: ", list2[1:5]) # list2[1:5]: [2, 3, 4, 5] 
list1[2] = 2001
print ("更新后的第三个元素为 : ", list1[2]) # 更新后的第三个元素为: 2001

2. 列表的切片;列表的切片返回新的列表

a = [1,2,3,4]
b = a[1:3]
print(b) # [2, 3]
b[0] = 100
print(b) # [100, 3]
print(a) # [1, 2, 3, 4]

3. 列表的拷贝可以是浅拷贝,也可以是深拷贝

a = [1,2,3,4]
b = a #a, b是同一个对象 
print(b is a) # True 
b[0] = 5
print(a) # [5, 2, 3, 4]
b += [10] # [5, 2, 3, 4, 10] ,原地添加,和元组不同
print(a) # [5, 2, 3, 4, 10]
print(b) # [5, 2, 3, 4, 10]
a = [1,2,3,4]
b = a[:] # b是a的拷贝
b[0] = 5 
print(a) # [1, 2, 3, 4]
b += [10] 
print(a) # [1, 2, 3, 4]
print(b) # [5, 2, 3, 4, 10]

如果是列表之中套列表,需要通过函数来进行深拷贝

a=[1,[2]]
b=a[:]
b.append(4)
print(b) #=> [1, [2], 4] 
a[1].append(3)
print(a) #=> [1, [2, 3]] 
print(b) #=> [1, [2, 3], 4]
# 未能进行深拷贝!
import copy
a = [1,[2]]
b = copy.deepcopy(a) 
b.append(4) #=>[1, [2], 4] print(b)
a[1].append(3)
print(a) #=>[1, [2, 3]] 
print(b) #=>[1, [2], 4]

4. 列表生成式(python太强大了)

[x * x for x in range(1, 11)]
# [1, 4, 9, 16, 25, 36, 49, 64, 81, 100]
[x * x for x in range(1, 11) if x % 2 == 0]
# [4, 16, 36, 64, 100]
[m + n for m in 'ABC' for n in 'XYZ']
# ['AX', 'AY', 'AZ', 'BX', 'BY', 'BZ', 'CX', 'CY', 'CZ'] 
L = ['Hello', 'World', 18, 'Apple', None]
[s.lower() for s in L if isinstance(s,str)]
# ['hello', 'world', 'apple']
[s for s in L if isinstance(s,int )] 
# [18]

5. 处理输入

while True:
    s = input() #读取一行 
    if s.strip() == "":
        continue; # 除去空白字符之后如果为空,就continue
    a = s.split(' ')
    b = [x for x in a if x != ''] # 除去空串
    name,age,gpa = b[0],b[1],b[2]
    print(name,age,gpa)

6. 列表函数

append (value) 添加1个元素

extend (list) 添加其他表中的元素

insert,remove,reverse

index 查找

len(x) 求列表x长度

a = [1,2,3]
b = [5,6] 
a.append(b) # [1, 2, 3, [5, 6]]
a.extend(b) # [1, 2, 3, [5, 6], 5, 6]
a.insert(1,'K') # [1, 'K', 2, 3, [5, 6], 5, 6]
a.insert(3,'K') # [1, 'K', 2, 'K', 3, [5, 6], 5, 6]
a.remove('K') # [1, 2, 'K', 3, [5, 6], 5, 6]
a.reverse() # [6, 5, [5, 6], 3, 'K', 2, 1]
a.index('K') # 4
print(len(a)) # 7

map(function, sequence),将一个列表(元组)映射到另一个列表(元组)

filter(function, sequence),按照所定义的函数过滤掉列表(元组)中的一些元素

def f1(x):
    return x * 2
def f2(x):
    return x % 2 == 0 
ls = [1,2,3,4,5]
ls1 = list(map(f1,ls)) # map 延时求值
print(ls1) #=>[2, 4, 6, 8, 10]
ls1 = list(filter(f2,ls)) # filter 延时求值
print(ls1) #=>[2, 4]
def f1(x):
    return x * 2
def f2(x):
    return x % 2 == 0
ls = (1,2,3,4,5)
ls1 = tuple(map(f1,ls))
print(ls1) #=>(2, 4, 6, 8, 10)
ls1 = list(filter(f2,ls))
print(ls1) #=> [2, 4]

map 高级用法(把列表中的每一个元素都进行相应的函数操作)

def abc(a, b, c):
return a*10000 + b*100 + c 
list1 = [11,22,33]
list2 = [44,55,66]
list3 = [77,88,99]
x = list(map(abc,list1,list2,list3)) 
print(x) #=> [114477, 225588, 336699]

reduce(function, sequence, startValue),将一个列表累积(accumulae)起来

from functools import reduce 
def f2(x,y):
    return x+y
ls = [1,2,3,4,5]
print(reduce(f2,ls)) #=>15 
print(reduce(f2,ls,10)) #=>25

7. 用列表定义二维数组

错误的做法

array = [1, 2, 3]
matrix = [array*3]
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值