1.Python缩进
elements = ["Tom","Jack","Anne"]
for elem in elements:
print("Hello",elem)
print("I love you",elem)
print("Bye My",elements)
2.基本类型
2.1变量
大小写英文、数字和_ 的组合,且不能用数字开头
2.2常量
Python里通常用全大写变量名表示常量,但不强制
2.3字符串编码
-
Python3采用Unicode编码,常见计算机系统内存统一采用Unicode编码,当需要保存到硬盘或者传输时,就转化为UTF-8编码,反之转化回Unicode。 -
Python对于 bytes 类型的数据用带 b 前缀的单引号或双引号表示: x = b'ABC'
-
字符串可用encode( )方法可以编码为指定的bytes >>> 'ABC'.encode('ascii')
b'ABC'
>>> '中文'.encode('utf-8')
b'\xe4\xb8\xad\xe6\x96\x87'
>>> '中文'.encode('ascii')
-
len( )函数计算str字符数 >>> print(len("你好"))
2
>>> print(len("nihao"))
5
如果是计算bytes,则是字节数 >>> len(b'ABC')
3
>>> len(b'\xe4\xb8\xad\xe6\x96\x87')
6
>>> len('中文'.encode('utf-8'))
6
坚持使用UTF-8编码避免乱码问题
3.格式化
>>> print("hello ,%s,I'm %d years old,my score is %f"%("jack",18,95.00))
hello ,jack,I'm 18 years old,my score is 95.000000
另外一种是str.format( )方法,不推荐
4.list 和tuple
-
list是一种有序的集合,可以增删, elements = ["A",123,["C","D"],True]
elements.append("abcd")
elements.insert(2,("2","3"))
elements.pop(0)
print(elements)
print(elements[-3][0])
[123, ('2', '3'), ['C', 'D'], True, 'abcd']
C
-
tuple一旦初始化不能修改,没有append( ), insert( )这种方法,能使用-1…表示索引 tuple用 () 表示(注意和数学符号意义上的区别,通常用 , 如( 1,)加以区分) tuple里面若有指向别的元素如list,指向的list不可改变,但是list指向的可以改变 tuple = ("A", "B", ["C","D"])
5.dict和set
6.Python小结
列表list []、元组tuple ()、字典 dict {key: value}、无序不重复集合 set (list[])
7.函数
-
参数
-
位置参数 平时常用的按照顺序进行传参的参数 def power(x,n):
temp = 1
if n<0:
for t in range(n,0):
temp = temp/x
elif n>0:
for t in range(0,n):
temp = temp*x
return temp
print("power(5,3):",power(5,3))
print("power(5,-2):",power(5,-2))
-
默认参数 默认参数在后面,默认参数必须指向不变对象,不然下次调用时默认参数内容就变了 def enroll(name,age,city="北京",sex="保密"):
print("My name is ",name,",I`m ",age)
print("I`m come from ",city,",my sex is",sex)
enroll("李华",23,sex = "女")
enroll("张三",18)
enroll("李四",45,"上海","男")
-
可变参数 在参数前加一个 * ,参数接收到的可以是一个tuple,也可以是任意个参数包括0个 对于已有的tuple和list,在前面加一个 * 就可变成可变参数传入函数 def calc(*numbers):
sum = 0
for number in numbers:
sum = sum + number
return sum
nums1 = [1,3,5,7]
nums2 = (1,3,5,7)
print(calc(1,3,5,7))
print(calc(*nums2))
print(calc(*nums1))
-
关键字参数 允许传入0至多个参数,在函数内部自动组装为一个dict def info(name, age, **more):
print(name," ",age," ",more)
if "city" in more:
pass
if "addr" in more:
print("my city:",more.get("addr"))
info("李华",12,addr="钦州市",sex = "男")
extra = { "addr":"钦州市","sex":"男"}
info("李华",12,**extra)
小结:对于任意函数,都可以通过类似func(*args, **kw) 的形式调用它,无论它的参数是如何定义的。 -
递归 -
元信息
def add(x:int, y:int) -> int:
return x+y
元信息只是为了帮助源码阅读。python解释器不会对这些注解添加任何的语义。即使返回类型不一致,程序也不会出错,因为它们不会被类型检查。
8.高级特性
-
切片 : 用来取list或tuple的部分元素 L = list(range(100,200))
print(L[:3])
print(L[1:3])
print(L[-20:-10])
print(L[:10:2])
print(L[::-1])
-
迭代 1、 通过for...in 来完成迭代,不仅可以在 tuple 、 list 和 dict 上进行迭代,还可以作用于可迭代对象(可通过collections.abc 模块的 Iterable 类型判断) >>>isinstance('abc',Iterable)
True
>>>isinstance(123,Iterable)
False
2、实现Java下标循环 >>>for i,x in enumerate(['A','B','C']):
>>> print(i,x)
0 A
1 B
2 C
-
列表生成式
-
列表生成式可以嵌套一层至多层循环
>>>print([x*x for x in range(1,5)])
[1,4,9,16]
>>>dictItem = {'A':'a','B':'b','C':'c'}
>>>print([a+'='+b for a,b in dictItem.items])
['A=a','B=b','C=c']
>>>print([x*x for x in range(1,10) if x%2==0])
[4, 16, 36, 64]
>>>print([a+b for a in ['1','2','3'] for b in ['A','B','C']])
['1A', '1B', '1C', '2A', '2B', '2C', '3A', '3B', '3C']
-
if...else 的使用(使用方法为在for循环前加上if…else) >>>dictItem = {'A':2,'B':'b','C':'c','D':3}
>>>print([a+'='+b if isinstance(b,str) else a+'='+str(b) for a,b in dictItem.items()])
['A=2', 'B=b', 'C=c','D=3']
-
生成器(Generator) next() 、yelid 、StopIteration generator函数返回一个generator对象
9. 高阶函数
-
map() 、 reduce() 和 filter()
-
map() 接收一个函数和Iterator,将函数作用到所有Iterator元素 上并将结果返回到新的Iterator,最终结果返回新的Iterator。 >>> def f(x):
return x * x
>>> r = map(f, [1, 2, 3, 4, 5, 6, 7, 8, 9])
>>> list(r)
[1, 4, 9, 16, 25, 36, 49, 64, 81]
-
reduce 接收一个函数和一个序列,该函数必须接收两个参数 ,reduce 负责将函数结果 继续和 序列下一个元素 作为两个参数继续执行下一次函数,直到后序无元素,最终结果为计算结果 >>>def add(x,y):
>>> return x+y
>>>reduce(add,[1,3,5,7])
16
思考题:利用map 和reduce 编写一个str2float 函数,把字符串'123.456' 转换成浮点数123.456
-
filter 接收一个函数和一个序列,将 函数作用于每个元素 ,然后根据返回值是 True 还是 False 决定保留或者丢弃元素。 >>>def not_empty(s):
>>> return s and s.strip()
>>>print(list(filter(not_empty,['A',None,'B','']))
['A', 'B']
-
sorted() sorted() 可以对list进行排序,也是一个高阶函数,可以接收一个 key 函数自定义排序顺序 >>>sorted([9,-1,2,4,-5],key=abs)
[-1, 2, 4, -5, 9]
sorted() 函数负责将key函数返回的结果 进行排序,并按对应关系返回list中的元素 此外,要实现反向排序还可以传入 reverse 的值为 True >>>print(sorted([9,-1,2,4,-5],key=abs,reverse=True))
[9, -5, 4, 2, -1]
sorted() 返回结果为list
10. 函数式编程
-
返回函数
-
一个函数可以返回值,也可以返回函数 def lazy_sum(L):
def sum(L):
result = 0
for x in L:
result = result + x
return result
return sum
test = lazy_sum([1,2,3,4,5])
print(test())
? 上述例子,如果函数内只是返回函数名 而不是返回执行函数,则为 闭包运算 ;此外,返回闭包时,要注意返回函数不能引用任何循环变量或者后续会发生变化的变量。 -
nonlocal 声明该变量不是当前函数的局部变量 -
匿名函数(lambda) 关键字 lambda 参数 x,y : 函数返回值 x+y lambda x,y: x+y
多数时候配合高阶函数 map() 、filter() 、reduce() 、sorted() 使用 -
装饰器(decorator) 在代码运行期间动态增加功能的方式。(动态语言的函数和类的定义,是在运行时动态创建的。) 要借助Python的 @ 语法,把decorator放在函数 定义处 : import time
def log(func):
def wrapper(*args,**kw):
print('call %s()'%func.__name__)
return func(*args,**kw)
return wrapper
@log
def now():
print(time.strftime("%Y-%m-%d %H:%M:%S"))
-
偏函数 当函数的参数个数太多,需要简化时,使用functools.partial 可以创建一个新的函数,这个新函数可以固定住原函数的部分参数,从而在调用时更简单 >>> import functools
>>> int2 = functools.partial(int, base=2)
>>> int2('1000000')
64
>>> int2('1010101')
85
11. 模块
-
作用域 _xxx 或者 _xxx_ 表示的 函数 或者 变量 一般为非公开的(private),不应该被直接引用(但依然可以在其它模块强制引用)。
>>>import datetime
>>>import time
>>>def showtime():
>>> print(time.strftime("%Y-%m-%d %H:%M:%S"))
>>>__t = time.strftime("%Y")
>>>def __showyear():
>>> print(__t)
>>>from 工具类 import showtime,__showyear,__t
>>>showtime()
>>>print(__t)
>>>__showyear()
2022-02-26 18:36:49
2022
2022
只有外部需要的函数或者变量才定义为public。 -
安装第三方模块 包管理工具 pip
12.面向对象编程
-
类和实例及其访问权限
class Student(object):
def __init__(self, name, gender):
self.__name = name
self.__gender = gender
def get_gender(self):
return self.__gender
def set_gender(self,s):
if s =='male'or'female':
print(self.__gender)
self.__gender = s
print(self.__gender)
else:
raise ValueError('值错啦')
bart = Student('Bart', 'male')
if bart.get_gender() != 'male':
print('测试失败!')
else:
bart.set_gender('female')
if bart.get_gender() != 'female':
print('测试失败!')
else:
print('测试成功!')
-
方法 Python中的方法分为三种:实例方法、类方法、静态方法。
-
实例方法 参数里面有 self ,如: def set_self(self,name):
self.__name = name
-
类方法 前面带有装饰器 @classmethod ,且参数里面有 cls ,如: @classmethod
def class_func(cls):
cls.name = "我是类名"
print("my name is %s"%(cls.name))
-
静态方法 形参中没有 cls 和 self ,甚至没有参数,如: import random
@staticmethod
def static_func():
randomNum = random.randint(0,9)
return randomNum
类方法和静态方法都可以通过类名和实例名调用 -
获取对象信息
-
type()方法 >>> type(123)==int
True
>>> type('abc')==type('123')
True
>>> type('abc')==str
True
该方法返回对应的Class类型 -
id()方法 >>>str1 = 'test'
>>>str2 = "test"
>>>str3 = str1
>>>int1 = 123
>>>list1 = [1,2,'3']
>>>tuple1 = (1,2,3,[1,2,'3'])
>>>total =['test',str2,str3,int1,list1,tuple1]
>>>print(list(id(i) for i in total[:3] if >>>type(i)==str))
>>>print(list(id(i) for i in total))
[2408464217968, 2408464217968, 2408464217968]
[2408464217968, 2408464217968, 2408464217968, 2408455690416, 2408507421120, 2408507410448]
从输出结果可以看出程序运行时str1、str2、str3的id值是一样的 -
isinstance()方法 如果有继承关系:Object ->Animal ->Dog ->Husky 那么则 a = Animal()
b = Dog()
h = Husky()
>>>isinstance(h,Husky)
True
>>>isinstance(h,Animal)
True
isinstance() 还可以判断其类型及其子类,一般情况下优先使用isinstance() 判断类型 isinstance() 还可以判断是否为某些变量其一 >>> isinstance([1, 2, 3], (list, tuple))
True
>>> isinstance((1, 2, 3), (list, tuple))
True
-
__doc__属性 >>>print(len.__doc__)
Return the number of items in a container.
用于查看某对象支持的方法或属性清单 此外还有 help() 方法,可以帮助显示方法或属性信息 -
类属性 直接定义在类中,区别于实例属性self.xxx -
动态绑定 动态绑定允许我们在程序运行的过程中动态给class加上功能 class Student(object):
def __init__(self,name):
self.__name__ = name
stu1 = Student('张三')
stu1.sex = 'male'
print(stu1.sex)
def set_name(self,name):
self.__name__ = name
from types import MethodType
stu1.set_name = MethodType(set_name, stu1)
stu1.set_name('李四')
print(stu1.__name__)
为了限制类外动态绑定属性或方法,可以定义在定义类时用__slots__ 变量,来限制该class实例能添加的属性。 class Student(object):
__slots__ = ('name','__name__')
def __init__(self,name):
self.__name__ = name
此时如果向Student类添加sex属性则会报AttributeError 注意:__slots__ 定义的属性仅对当前类实例起作用,对继承的子类是不起作用 练习:利用@property 给一个Screen 对象加上width 和height 属性,以及一个只读属性resolution class Screen(object):
@property
def width(self):
return self.__width__
@width.setter
def width(self,size):
if isinstance(size,(int,float))==False:
raise TypeError('请输入正确的int或其它数值类型')
if size < 0 or size > 2048:
raise ValueError('请输入正确范围的数')
self.__width__ = size
@property
def height(self):
return self.__height__
@height.setter
def height(self,size):
if isinstance(size,(int,float))==False:
raise TypeError('请输入正确的int或其它数值类型')
if size < 0 or size > 2048:
raise ValueError('请输入正确范围的数')
self.__height__ = size
@property
def resolution(self):
return self.__width__*self.__height__
-
多重继承 通过多重继承,一个子类就可以同时获得多个父类的所有功能 class Dog(Mammal,Runnable):
def __init__():
pass
MixIn 用于分清主父类和额外功能(类似于Java的继承单一父类和多继承接口) class Dog(Mammal,RunnableMixIn):
def __init__():
pass
-
__str__ Python里面的 __str__ 相当于Java 的 toString() 方法 class Student(object):
__slots__ = ('name','__name__')
def __init__(self,name):
self.__name__ = name
def __str__(self) -> str:
return 'my name is%s '%(self.__name__)
stu1 = Student('张三')
print(stu1)
同样的还有 __getattr__ 、 __call__ 、 __iter__ 、 __getitem__ 等 可根据需要前往官网文档查阅相关资料,不再赘述。
13. 异常、错误、调试
-
错误与错误 高级语言通常都内置了一套try...except...finally... 的错误处理机制,Python也不例外 try:
except IOError as e :
print("An EOF error occurred.")
raise e
except (Ex2,Ex3):
except Exception:
else:
finally:
-
调试 有三种方式:Python Debugger 、%xmode 、assert
原文链接,也是博主的网站:wangwangyz.site/?p=253
|