主题
Python是我目前见过的语言中最简洁优雅的,以至于我有一种相见恨晚的感觉。下面是一些笔记(代码)。😃
python
#!/usr/bin/env python3
# -*- coding: utf-8 -*-
__author__='Chiang'
import math
import time
import functools
import logging
logging.basicConfig(level=logging.INFO)
print('hello world!');
print('1','sherlock',3);
print("1+3=",1+3);
#输入输出测试
#name=input("please tell me your name:");
#print("hello,"+name);
#注意条件语句的写法
age=20;
if age>18:
print("1");
else:
print('0');
#值的交换
a='1';
b='0';
temp=a;
a=b;
b=temp;
print(a,b);
#常量
PI=3.141592654;
print(PI);
print(ord('A'));
print(len('str'));
print("我爱你!");
#浮点数的表示
#%运算符就是用来格式化字符串的
s1 = 72
s2 = 85
r = (s2 - s1)/ s2 * 100
print('%.1f%%' % r)
print('%d' % (1/3))
print('%s' % (1/3))
#Python内置的一种数据类型是列表:list。list是一种有序的集合,可以随时添加和删除其中的元素。
fruits=['apple','orange','lemon'];
print(fruits[-len(fruits)] )
#正向从0开始,负向从1开始
print(fruits[-1])
print(fruits[-2])
fruits.append('apple');
#追加
print('fruits appended:',fruits)
#插入
fruits.insert(0,'juice');
print('inserted fruits:',fruits);
#删除
fruits.pop(1);
print('popped fruits:',fruits);
#循环
for fruit in fruits:
print(">>",fruit);
L = [
['Apple', 'Google', 'Microsoft'],
['Java', 'Python', 'Ruby', 'PHP'],
['Adam', 'Bart', 'Lisa']
]
print(L[0][0],L[1][1],L[2][2])
final=(1,2,3,4,5);
print(final);
#条件语句
BMI=55/(1.78*1.78);
if BMI>32:
print('exacly fat');
elif BMI>=28:
print('fat');
elif BMI>=25:
print('heavy');
elif BMI>=18.5:
print('middle');
else:
print('slin');
#高斯求和
sum=0;
#range(n) 0-> n 但不包括n
for num in range(101):
sum+=num;
print(sum);
#Python内置了字典:dict的支持,dict全称dictionary,在其他语言中也称为map,
#使用键-值(key-value)存储,具有极快的查找速度。
score = {'Michael': 95, 'Bob': 75, 'Tracy': 85}
print(score['Bob'])
#要避免key不存在的错误,有两种办法,一是通过in判断key否存在:
#二是通过dict提供的get方法,如果key不存在,可以返回None,或者自己指定的value:
rs='a' in score;
#False
print(rs);
# none
print(score.get('a'))
#要删除一个key,用pop(key)方法,对应的value也会从dict中删除:
score.pop('Bob');
print(score);
#set和dict类似,也是一组key的集合,但不存储value。由于key不能重复,所以,在set中,没有重复的key。
s=set([1,2,3,4,4,5,5,5,6,6,6,6,6,6]);
print(s);
#通过add(key)方法可以添加元素到set中,可以重复添加,但不会有效果:
#通过remove(key)方法可以删除元素:
#set可以看成数学意义上的无序和无重复元素的集合,因此,两个set可以做数学意义上的交集、并集等操作:
s1=set([1,2,3,4]);
s2=set([3,4,5,6]);
#求交集
print(s1 & s2);
#函数
print(abs(2-3))
print(max(1,2,3,100))
print(min(0,1))
print(str(123))
print(int('123'))
print(float('12.3455'))
m=9
n=10
for x in [m,n]:
print('%s的十六进制的字符串是' %x,hex(x))
#在Python中,定义一个函数要使用def语句,依次写出函数名、括号、括号中的参数和冒号:,然后,在缩进块中编写函数体,函数的返回值用return语句返回。
def myabs(x):
#数据类型检查可以用内置函数isinstance()实现:
if not isinstance(x,(int,float)):
raise TypeError(' bad operand type ')
if x>0:
return x
else:
return -x
print(myabs(-1))
#print(myabs('a'))
def move( x , y , step , angle ):
newX=x+step*math.cos(angle)
newY=y+step*math.sin(angle)
return newX,newY
#Python的函数返回多值其实就是返回一个tuple
print(move(1,1,4,math.pi/6))
def power(x,n=2):
s=1
while n>0:
n=n-1;
s=s*x;
return s;
def quadratic(a,b,c):
flag=power(b)-4*a*c
rs1=0
rs2=0
if flag < 0:
return '无解'
elif flag==0:
rs1=(-b+math.sqrt(power(b)-4*a*c))/2*a
rs2=(-b-math.sqrt(power(b)-4*a*c))/2*a
return rs1
else:
rs1=(-b+math.sqrt(power(2)-4*a*c))/2*a
rs2=(-b-math.sqrt(power(2)-4*a*c))/2*a
return rs1,rs2
print(quadratic(1,2,1));
print(power(2,10))
#a2 + b2 + c2 + ……
#可变参数就是传入的参数个数是可变的
def calc(*nums):
s=0
for num in nums:
s=s+power(num)
return s;
print(calc(1,2,3));
#对于任意函数,都可以通过类似func(*args, **kw)的形式调用它,无论它的参数是如何定义的
def person(name,age,**kw):
print('name:',name,'age:',age,'other:',kw)
person('sherlock','32')
person('sherlock','32',address='Baker Street 221B')
def loop(max,n=1):
if max==1:
return n;
else:
return loop(max-1,max*n);
print(loop(100))
#切片(Slice)操作符,能大大简化这种操作
arr=[1,2,3,4,5]
print(arr[0:3])
#起始位置是0可省略
print(arr[:3])
#step步长
print(arr[::2])
json={'a':'1','b':'2','c':'3'}
#key
for key in json:
print(key)
#val
for val in json.values():
print(val)
#item
for k,v in json.items():
print(k,v)
#带下标的循环
for i, value in enumerate(['A', 'B', 'C']):
print(i, value)
#2个变量循环
for x,y in [(1,2),(2,3),(3,4)]:
print(x,y)
#如何判断一个对象是可迭代对象呢?方法是通过collections模块的Iterable类型判断
from collections import Iterable
print(isinstance('abc', Iterable))
#列表生成式
print(list(range(1,11)))
print( [x*x for x in range(1,11)] )
print( [x*x for x in range(1,11) if x%2==0 ] )
Lm = ['Hello', 'World', 18, 'Apple', None]
Ln = [s.lower() for s in Lm if(isinstance(s,str))]
print(Ln)
def fib(max):
n,a,b=0,0,1
while n<max:
print(b)
(a,b)=(b,a+b)
n=n+1
return 'done'
fib(100)
#要理解generator的工作原理,它是在for循环的过程中不断计算出下一个元素,并在适当的条件结束for循环。对于函数改成的generator来说,遇到return语句或者执行到函数体最后一行语句,就是结束generator的指令,for循环随之结束。
#函数本身也可以赋值给变量,即:变量可以指向函数。
#把函数作为参数传入,这样的函数称为高阶函数,函数式编程就是指这种高度抽象的编程范式。
def add(x,y,f):
return f(x)+f(y)
print(add(-1,-2,abs))
#map
print( list(map(str, [1, 2, 3, 4, 5, 6, 7, 8, 9])) )
#reduce
from functools import reduce
def fn(x,y):
return x*10+y
print(reduce(fn,[1,2,3,4,5,6]))
def normalize(name):
return name.capitalize()
L1 = ['adam', 'LISA', 'barT']
L2 = list(map(normalize, L1))
print(L2)
#filter
def isodd(x):
return x%2==0
print(list(filter(isodd,[1,2,3])))
#去掉空字符串
def not_empty(s):
return s and s.strip()
print(list(filter(not_empty,['1','',' ',' ','3'])))
#回文数
def is_palindrome(n):
return str(n)[::]==str(n)[::-1]
output = filter(is_palindrome, range(1,1000))
print(list(output))
#倒序
print('123'[::-1])
#排序
print(sorted(['bob', 'about', 'Zoo', 'Credit'], key=str.lower,reverse=True))
scoreList=[('Bob', 75), ('Adam', 92), ('Bart', 66), ('Lisa', 88)]
for k in scoreList:
print(k[0])
def by_name(t):
return t[0]
def by_score(t):
return t[1]
La=sorted(scoreList,key=by_name)
Lb=sorted(scoreList,key=by_score,reverse=True)
print (La)
print (Lb)
#返回函数
def lazy_sum(*args):
def sum():
ax = 0
for n in args:
ax = ax + n
return ax
return sum
f=lazy_sum(1,2,3,4,5,6,7,8,9)
print(f())
#python装饰器,decorator就是一个返回函数的高阶函数
def log(func):
def wrapper(*args, **kw):
print('call %s():' % func.__name__)
return func(*args, **kw)
return wrapper
#获取当前时间
@log
def getCurrentTime():
return time.strftime('%Y-%m-%d %H:%M:%S',time.localtime(time.time()))
print(time.time())
print(getCurrentTime())
#偏函数设定参数的默认值,可以降低函数调用的难度
#int()函数还提供额外的base参数,默认值为10。如果传入base参数,就可以做N进制的转换
def int2(x,base=2):
return int(x,base)
print(int2('10000'))
#当函数的参数个数太多,需要简化时,使用functools.partial可以创建一个新的函数,
#这个新函数可以固定住原函数的部分参数,从而在调用时更简单。
int16= functools.partial(int, base=16)
print(int16('16'))
#作用域
#正常的函数和变量名是公开的(public),可以被直接引用,比如:abc,x123,PI等;
#类似__xxx__这样的变量是特殊变量,可以被直接引用
#类似_xxx和__xxx这样的函数或变量就是非公开的(private),不应该被直接引用,比如_abc,__abc等;
#外部不需要引用的函数全部定义成private,只有外部需要引用的函数才定义为public。
def _private_1(name):
return 'Hello, %s' % name
def _private_2(name):
return 'Hi, %s' % name
def greeting(name):
if len(name) > 3:
return _private_1(name)
else:
return _private_2(name)
print(greeting('sherlock !'))
#安装第三方模块: 包管理工具pip
#如果你正在使用Windows,请参考安装Python一节的内容,确保安装时勾选了pip和Add python.exe to Path
# >>>pip install Pillow
#更换py源
# C:\Users\Money\AppData\Local\pip 新建一个pip.ini
# -------------豆瓣-------------------------------
# [global]
# timeout = 6000
# index-url = http://pypi.douban.com/simple
# trusted-host = http://pypi.douban.com
# -------------豆瓣-------------------------------
# -------------阿里云-------------------------------
# [global]
# timeout = 6000
# index-url = http://mirrors.aliyun.com/pypi/simple/
# trusted-host=mirrors.aliyun.com
# -------------阿里云-------------------------------
# pypi.tuna.tsinghua.edu.cn
# -i 指定来源
# pip install web.py -i http://pypi.douban.com/simple
# 常用的第三方库:mysql-connector-python numpy(科学计算)
#面向对象:
#类名通常是大写开头的单词,紧接着是(object),表示该类是从哪个类继承下来的
class Student(object):
#特殊方法“init”前后有两个下划线!!!
def __init__(self,name,score):
# self.___name 私有变量,只能访问不能修改
self.__name=name
# self.___score
self.__score=score
def get_name(self):
return self.__name
def set_name(self,name):
self.__name=name
def print_info(self):
#注意百分号后面的括号
print('%s: %s' % (self.__name , self.__score) )
def get_level(self):
if self.__score>90:
return 'A'
if self.__score>80:
return 'B'
if self.__score>60:
return 'C'
#sublime text3:代码区直接全选就会看到有的地方是四个点有个地方是一个横线,改一致了就好了
sherlock=Student('sherlock holmes',100)
sherlock.print_info()
print(sherlock.get_level())
# 在定义class的时候,定义一个特殊的__slots__变量,来限制该class实例能添加的属性
#
class Animal(object):
# __slots__ = ('name', 'age') # 用tuple定义允许绑定的属性名称
# __slots__定义的属性仅对当前类实例起作用,对继承的子类是不起作用的
def __init__(self,name):
self.__name=name;
#默认self必须写上
def run(self):
print(self.__name,'i can run')
cat=Animal('cat')
cat.run()
class Dog(Animal):
def eat(self):
print('i want to eat bones')
class Cat(Animal):
def jump(self):
print('i can jump')
dog=Dog('dog')
dog.run()
dog.eat()
cat=Cat('cat')
cat.jump()
# 获取对象信息:判断对象类型
# 使用type()函数
print(type(123))
print(type(abs))
# type(123)==type(456) int True
# type('abc')==type('123') str True
# 判断一个对象是否是函数,可以使用types模块中定义的常量
# 使用isinstance()
# isinstance('a', str) True
# isinstance(123, int) True
# isinstance(b'a', bytes) True
# 并且还可以判断一个变量是否是某些类型中的一种,比如下面的代码就可以判断是否是list或者tuple
# isinstance([1, 2, 3], (list, tuple)) True
# isinstance((1, 2, 3), (list, tuple)) True
# hasattr(obj,'name',404) 可以传入一个default参数,如果属性不存在,就返回默认值
# getattr(obj,'name')
# setattr(obj,'name')
# 千万不要把实例属性和类属性使用相同的名字,因为相同名称的实例属性将屏蔽掉类属性
# example
def readImage(fp):
if hasattr(fp, 'read'):
return readData(fp)
return None
# @property,我们在对实例属性操作的时候,就知道该属性很可能不是直接暴露的
# 而是通过getter和setter方法来实现的
# birth是可读写属性,age就是一个只读属性
class Person(object):
def __str__(self):
return 'Student object (birth: %s)' % self._birth
__repr__ = __str__
@property
def birth(self):
return self._birth
@birth.setter
def birth(self, value):
self._birth = value
@property
def age(self):
return 2017 - self._birth
#如果一个类想被用于for ... in循环,类似list或tuple那样,就必须实现一个__iter__()方法,该方法返回一个迭代对象,
#然后,Python的for循环就会不断调用该迭代对象的__next__()方法拿到循环的下一个值,直到遇到StopIteration错误时退出循环。
class Fib(object):
def __init__(self):
self.a, self.b = 0, 1 # 初始化两个计数器a,b
def __iter__(self):
return self # 实例本身就是迭代对象,故返回自己
def __next__(self):
(self.a, self.b) = (self.b, self.a + self.b) # 计算下一个值
if self.a > 100000: # 退出循环的条件
raise StopIteration()
return self.a # 返回下一个值
for n in Fib():
print(n)
class Chain(object):
def __init__(self, path=''):
self._path = path
def __getattr__(self, path):
return Chain('%s/%s' % (self._path, path))
def __str__(self):
return self._path
__repr__ = __str__
#枚举
from enum import Enum, unique
#类似常量
Month = Enum('Month', ('Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec'))
# @unique装饰器可以帮助我们检查保证没有重复值
@unique
class Week(Enum):
Sun = 0
Mon = 1
Tue = 2
Wed = 3
Thu = 4
Fri = 5
Sat = 6