GOOD DAY

天天向上<< High一下!

Python

15 Oct 2018 - NanJing


    #!/usr/bin/env python3
    # -*- coding: utf-8 -*-
    '''
    print('100+200-99 =',100+200-99);
    name=input('please enter your name: ');
    print('hello,', name);
    '''
    #数据类型和变量
    a = 100
    if a>=0:
    print(a)
    else:
    print(-a)
    
	#enumerate
	li = [12,24,35,70,88,120,155]
	li = [x for (i,x) in enumerate(li) if i not in (0,4,5)]
	print li

	#逆序
	s[::-1]	

	#dict默认get不存在
	dic.get(s,0)+1
    
	#二维数组5*5
	print ([[x for x in range(1,26)] [i:i+5] for i in range(0,25,5)])

    #格式化
    print('hello,%s' % 'world')
    print('Hi, %s, you have $%d.' % ('Michael', 1000000))
    print('%2d-%02d' % (3, 1))
    print('%.2f' % 3.1415926)
    r=(85-72)/85
    print('提升了%.1f%%' % r)
    #list和tuple
    list1 = ['Monica', 'Chandler', 'Rose']
    print(len(list1))
    list1.append('Joey')
    print(list1)
    list1.append('Rachel')
    print(list1)
    list1.insert(1,'Jean')
    print(list1)
    list1.pop(1)
    list1 = ['Apple', 123, True]
    print(list1)
    list1 = ['python', 'java', ['asp', 'php'], 'scheme']
    print(list1)
    tuple1 = (1,2,3)
    print(tuple1)
    #判空
    if not s.strip():
    print 's is null'
    #条件判断
    age = 3
    if age>=18:
    print('your age is',age)
    print('adult')
    elif age>=6:
    print('teenager')
    else:
    print('kid')
    
    #s = input('birth: ')
    birth=2018
    #birth = int(s)
    if birth < 2000:
    print('00前')
    else:
    print('00后')
    #循环
    for item in list1:
    print(item)
    
    sum=0
    for x in range(101):
    sum = sum+x
    print('1+2+...+100 =',sum)
    
    #dic(map)和set
    dic = {'michael':95, 'bob':73, 'tracy':85}
    print('bob:',dic['bob'])
    dic['jean']=100
    print('jean:',dic['jean'])
    print('jean:',dic.get('jean'))
    dic.pop('jean')
    print(dic)
    
    set1 = set([1,2,3,4,3,2,1])
    print(set1)
    set1.remove(1)
    print(set1)
    
    set2 = set([2,3,4,5,2,1])
    print(set1 & set2)
    print(set1 | set2)
    
    #函数
    def my_abs(x):
    if not isinstance(x, (int, float)):
    raise TypeError('bad operand type')
    if x >= 0:
    return x
    else:
    return -x
    
    print(my_abs(-0))
    
    #默认参数在后
    def enroll(name, gender, age=6, city='Beijing'):
    print('name:', name)
    print('gender:', gender)
    print('age:', age)
    print('city:', city)
    
    enroll('Bob', 'M', 7)
    enroll('Adam', 'M', city='Tianjin')
    #可变长参数
    def calc(numbers):
    sum = 0
    for n in numbers:
    sum = sum + n * n
    return sum
    print(calc([1, 2, 3]))
    print(calc((1, 2, 3)))
    
    def calc1(*numbers):
    sum = 0
    for n in numbers:
    sum = sum + n * n
    return sum
    nums = [1, 2, 3]
    print(calc1(*nums))
    print(calc1(1,2,3))
    
    #关键字参数
    def person(name, age, **kw):
    if 'city' in kw:
    # 有city参数
    pass
    if 'job' in kw:
    # 有job参数
    pass
    print('name:', name, 'age:', age, 'other:', kw)
    
    person('Michael', 30)
    person('Bob', 35, city='Beijing')
    extra = {'city': 'Beijing', 'job': 'Engineer'}
    person('Jack', 24, **extra)
    
    #递归
    def fact(n):
    if n==1:
    return 1
    return n * fact(n - 1)
    
    print(fact(100))
    
    #汉诺塔
    def move(n, a, b, c):
    if n==1:
    print(a,'-->',c)
    return
    move(n-1,a,c,b);
    print(a,'-->',c);
    move(n-1,b,a,c);
    
    move(3,'A','B','C')
    
    #高级特性
    # 切片
    L=['Monica','Chandler','Rose','Joey','Rachel']
    print(L[:3])
    L=list(range(100))
    print(L[::5])
    
    print('ABCDEFG'[:3])
    
    def trim(L):
    if L[:1] is ' ':
    return trim(L[1:])
    elif L[-1:] is ' ':
    return trim(L[:-1])
    else:
    return L
    
    if trim('hello  ') != 'hello':
    print('测试失败!')
    elif trim('  hello') != 'hello':
    print('测试失败!')
    elif trim('  hello  ') != 'hello':
    print('测试失败!')
    elif trim('  hello  world  ') != 'hello  world':
    print('测试失败!')
    elif trim('') != '':
    print('测试失败!')
    elif trim('') != '':
    print('测试失败!')
    else:
    print('测试成功!')
    
    #迭代
    d = {'x': 'A', 'y': 'B', 'z': 'C' }
    for k, v in d.items():
    print(k, '=', v)
    
    def findMinAndMax(L):
    if L:
    max=min=L[0]
    for item in L:
    if item>max:
    max=item
    elif item<min:
    min=item
    return (min,max)
    return (None,None)
    # 测试
    if findMinAndMax([]) != (None, None):
    print('测试失败1!')
    elif findMinAndMax([7]) != (7, 7):
    print('测试失败2!')
    elif findMinAndMax([7, 1]) != (1, 7):
    print('测试失败3!')
    elif findMinAndMax([7, 1, 3, 9, 5]) != (1, 9):
    print('测试失败4!')
    else:
    print('测试成功5!')
    #列表生成式
    #单层循环   
    print([x * x for x in range(1, 11) if x%2==0]);
    #多层循环
    print([m + n for m in 'ABC' for n in 'XYZ'])
    
    #列出当前目录下的所有文件和目录名
    import os # 导入os模块,模块的概念后面讲到
    print([d for d in os.listdir('.')]) # os.listdir可以列出文件和目录
    
    L1 = ['Hello', 'World', 18, 'Apple', None]
    print([item.lower() for item in L1 if isinstance(item,str)])
    
    #生成器
    g=(x*x for x in range(1,100))
    print(next(g))
    print(next(g))
    g = (x * x for x in range(10))
    for n in g:
    print(n)
    #斐波那契数列
    def fib(max):
    n,a,b=0,0,1
    while n<max:
    print(b)
    a,b=b,a+b
    n=n+1
    fib(10)
    #复杂生成器yield
    #这里,最难理解的就是generator和函数的执行流程不一样。函数是顺序执行,遇到return语句或者最后一行函数语句就返回。而变成generator的函数,在每次调用next()的时候执行,遇到yield语句返回,再次执行时从上次返回的yield语句处继续执行。
    def fib(max):
    	n,a,b=0,0,1
    	while n<max:
    		yield b
    		a,b=b,a+b
    		n=n+1
    #杨辉三角
    def triangles():
    	L = [1]
    	while True:
    		yield L
    		L = [1]+[L[i]+L[i+1] for i in range(len(L)-1)]+[1]
    		n = 0
    
	results = []
    for t in triangles():
    	print(t)
    	results.append(t)
    	n = n + 1
    	if n == 10:
    		break
    
	if results == [
    [1],
    [1, 1],
    [1, 2, 1],
    [1, 3, 3, 1],
    [1, 4, 6, 4, 1],
    [1, 5, 10, 10, 5, 1],
    [1, 6, 15, 20, 15, 6, 1],
    [1, 7, 21, 35, 35, 21, 7, 1],
    [1, 8, 28, 56, 70, 56, 28, 8, 1],
    [1, 9, 36, 84, 126, 126, 84, 36, 9, 1]
    ]:
    	print('测试通过!')
    else:
    	print('测试失败!')
    
    #map reduce filter
    from functools import reduce
    def fn(x, y):
    return x * 10 + y
    
    def char2num(s):
    digits = {'0': 0, '1': 1, '2': 2, '3': 3, '4': 4, '5': 5, '6': 6, '7': 7, '8': 8, '9': 9}
    return digits[s]
    
    print(reduce(fn, map(char2num, '13579')))
	
	[x for x in filter(lambda x: x % 2 == 0, range(10))] 
	

	#count
	list.count(obj)
	str.count(sub,start,end)
	str.count(sub)

练习册

https://github.com/zhiwehu/Python-programming-exercises/blob/master/100%2B%20Python%20challenging%20programming%20exercises.txt

https://github.com/kenwoodjw/python_interview_question

实用

#获取当前文件所在目录  
path = os.path.dirname(os.path.realpath(__file__))

#csv文件读、写
reader = csv.DictReader(csvfile)	
writer = csv.DictWriter(csvfile, fieldnames=fieldnames, lineterminator='\n')
writer.writeheader()
writer.writerow(result)

#使用全局变量
global

python装饰器

类似切面代理实现(闭包)

	#早期写法
	def debug(func):
    	def wrapper():
    		print "[DEBUG]: enter {}()".format(func.__name__)
    		return func()
    	return wrapper
    
    def say_hello():
    	print "hello!"
    
    say_hello = debug(say_hello)  # 添加功能并保持原函数名不变

	#语法糖写法
	def debug(func):
	    def wrapper(*args, **kwargs):  # 指定宇宙无敌参数
	        print "[DEBUG]: enter {}()".format(func.__name__)
	        print 'Prepare and say...',
	        return func(*args, **kwargs)
	    return wrapper  # 返回
	
	@debug
	def say(something):
	    print "hello {}!".format(something)


	# 探索functools模块wraps装饰器的用途
	import time
	from functools import wraps
	
	def timeit(func):
	    @wraps(func)
	    def wrapper(*args, **kwargs):
	        start = time.clock()
	        ret = func(*args, **kwargs)
	        end = time.clock()
	        print('used:', end - start)
	        return ret
	
	    return wrapper
	
	
	@timeit
	def foo():
	    print('in foo()')
	foo()
	#输出
	in foo()
	used: 3.0344449665474756e-05