Python(第一篇)

一、整数–没有最大限制 超过范围inf

1、int() 强制装换整型

二、浮点数–没有最大限制 超过范围inf

1、除法/和//
	/得到的永远是浮点型 9/3 >>>3.0
	//得到的永远是整型 10//3 >>>3

三、字符串–单引号、双引号 转义字符 /

1、str是不变对象
	

例:a = 'abc' 
			b = a.replace('a','A')
		那么 a = 'abc'
		     b = 'Abc'
2、字符串截取用的也是切片操作

四、布尔-- True和false

 运算符 and  or  not  (not就是php的!)

五、空值–None

六、列表–有序的集合List

1、定义  a = ['a','b','c','d']   list是可变对象
2、下标取值 a[0] ='a' a[-1] ='d'
3、长度 len(a) >>> 3
4、末尾追加 a.append('e') 指定位置插入 a.insert(1,f)
5、删除末尾元素 a.pop()   指定位置删除 a.pop(2)
6、替换 直接赋值给其索引  a[0] ="A"
7、python中没有截取函数,用的都是切片
	例 取a中的前三个元素 a[0::3] >>>'a' 'b' 'c' a[-2::-1] >>> 'c' 'd'
	   每2个数取一个 a[::5]    a[:] 会复制一个a
	   取前10个数a[:10]  取后10个数 a[-10:]

七、元组–有序的列表tuple

1、定义  a = ('a','b','c','d')   一旦定义元组 就无法更改
2、tuple也可以用切片操作,只是操作的结果仍是tuple
	>>> (0, 1, 2, 3, 4, 5)[:3]
		(0, 1, 2)
3、它也没有append(),insert()这样的方法
4、只有1个元素的tuple定义时必须加一个逗号,,来消除歧义  a=(1,)

八、字典–dict key:value组合

1、定义 a = {'name':'tom','age':2,'sex':'男'} 取值 a['name']
2、查找 a.get('name') 如果key不存在,可以返回None,反之自己指定的value
3、删除 a.pop('name')
4、dict的key必须是不可变对象
5、和list比较,dict有以下几个特点:
	查找和插入的速度极快,不会随着key的增加而变慢;
	需要占用大量的内存,内存浪费多。
	而list相反:
	查找和插入的时间随着元素的增加而增加;
	占用空间小,浪费内存很少。

九、set类型 也是一组key的集合,但不存储value。由于key不能重复,所以,在set中,没有重复的key。

1、要创建一个set,需要提供一个list作为输入集合:
	>>> s = set([1, 2, 3])
	>>> s
	{1, 2, 3}
2、重复元素在set中自动被过滤:
	>>> s = set([1, 1, 2, 2, 3, 3])
	>>> s
	{1, 2, 3}	
3、通过remove(key)方法可以删除元素:
	>>> s.remove(4)
	>>> s
	{1, 2, 3}

十、不同数据类型的变量不能相互进行比较 必须进行强制转换 int() str() bool() float()

s = input('birth: ')
	birth = int(s)

十一、条件判断

if <条件判断1>:
    <执行1>
elif <条件判断2>:
    <执行2>
elif <条件判断3>:
    <执行3>
else:
    <执行4>
例:    
	def foo(a):
	if a>0:
		return '这是个正数'
	elif a<0:
		return '这是个负数'
	else:
		return '这是个0'

	re = foo(0)
	print(re)

十二、循环

1、for循环:
	sum = 0
	for x in range(10):
	    sum = sum + x
	print(sum)
	>>>55
2、while循环:	
	sum = 0
	n = 99
	while n > 0:
	    sum = sum + n
	    n = n - 2
	print(sum)
3、break
	在循环中,break语句可以提前退出循环。例如,本来要循环打印1~100的数字:
	n = 1
	while n <= 100:
	    if n > 10: # 当n = 11时,条件满足,执行break语句
	        break # break语句会结束当前循环
	    print(n)
	    n = n + 1
	print('END')
4、	continue
	在循环过程中,也可以通过continue语句,跳过当前的这次循环,直接开始下一次循环。
	n = 0
	while n < 10:
	    n = n + 1
	    if n % 2 == 0: # 如果n是偶数,执行continue语句
	        continue # continue语句会直接继续下一轮循环,后续的print()语句不会执行
	    print(n)

十三、函数

1、python系统内置函数 http://docs.python.org/3/library/functions.html#abs
2、定义函数
		def my_abs(x):
    if x >= 0:
        return x
    else:
        return -x
3、参数
	一是必选参数在前,默认参数在后,否则Python的解释器会报错(思考一下为什么默认参数不能放在必选参数前面);
	二是如何设置默认参数。当函数有多个参数时,把变化大的参数放前面,变化小的参数放后面。变化小的参数就可以作为默认参数。
4、注意:	定义默认参数要牢记一点:默认参数必须指向不变对象!
	例如:
	def add_end(L=[]):
		L.append('END')
		 return L
	当多次调用add_end的时候
	>>> add_end()
		['END']
	>>> add_end()
		['END', 'END']
	>>> add_end()
		['END', 'END', 'END']
	因为:Python函数在定义的时候,默认参数L的值就被计算出来了,即[],因为默认参数L也是一个变量,它指向对象[],每次调用该函数,如果改变了L的内容,则下次调用时,默认参数的内容就变了,不再是函数定义时的[]了。
	上面函数定义可以这样优化
	def add_end(L=None):
		if L is None:
   		 L = []
		L.append('END')
		 return L
	现在,无论调用多少次,都不会有问题:
	>>> add_end()
	['END']
	>>> add_end()
	['END']	
5、可变参数
	定义可变参数和定义一个list或tuple参数相比,仅仅在参数前面加了一个*号。在函数内部,参数numbers接收到的是一个tuple,因此,函数代码完全不变。但是,调用该函数时,可以传入任意个参数,包括0个参数
	def calc(*numbers):
	    sum = 0
	    for n in numbers:
	        sum = sum + n * n
	    return sum
	>>> calc(1, 2)
	5
	>>> calc()
	0
6、关键字参数
	可变参数允许你传入0个或任意个参数,这些可变参数在函数调用时自动组装为一个tuple。而关键字参数允许你传入0个或任意个含参数名的参数,这些关键字参数在函数内部自动组装为一个dict。请看示例:
	def person(name, age, **kw):
		 print('name:', name, 'age:', age, 'other:', kw)
	>>> person('Bob', 35, city='Beijing')
	name: Bob age: 35 other: {'city': 'Beijing'}
	>>> person('Adam', 45, gender='M', job='Engineer')
	name: Adam age: 45 other: {'gender': 'M', 'job': 'Engineer'}
7、命名关键字参数
8、组合参数
9、总结:
	Python的函数具有非常灵活的参数形态,既可以实现简单的调用,又可以传入非常复杂的参数。

	默认参数一定要用不可变对象,如果是可变对象,程序运行时会有逻辑错误!

	要注意定义可变参数和关键字参数的语法:

	*args是可变参数,args接收的是一个tuple;

	**kw是关键字参数,kw接收的是一个dict。

	以及调用函数时如何传入可变参数和关键字参数的语法:

	可变参数既可以直接传入:func(1, 2, 3),又可以先组装list或tuple,再通过*args传入:func(*(1, 2, 3));

	关键字参数既可以直接传入:func(a=1, b=2),又可以先组装dict,再通过**kw传入:func(**{'a': 1, 'b': 2})。

	使用*args和**kw是Python的习惯写法,当然也可以用其他参数名,但最好使用习惯用法。

	命名的关键字参数是为了限制调用者可以传入的参数名,同时可以提供默认值。

	定义命名的关键字参数在没有可变参数的情况下不要忘了写分隔符*,否则定义的将是位置参数

十四、递归函数

概念:在函数内部,可以调用其他函数。如果一个函数在内部调用自身本身,这个函数就是递归函数。
举个例子,我们来计算阶乘n! = 1 x 2 x 3 x ... x n,用函数fact(n)表示,可以看出:
def fact(n):
	if n==1:
   	 	return 1
return n * fact(n - 1)

注意:使用递归函数需要注意防止栈溢出。在计算机中,函数调用是通过栈(stack)这种数据结构实现的,每当进入一个函数调用,栈就会加一层栈帧,每当函数返回,栈就会减一层栈帧。由于栈的大小不是无限的,所以,递归调用的次数过多,会导致栈溢出。可以试试fact(1000):会报错

解决递归调用栈溢出的方法是通过尾递归优化,事实上尾递归和循环的效果是一样的,所以,把循环看成是一种特殊的尾递归函数也是可以的。
尾递归是指,在函数返回的时候,调用自身本身,并且,return语句不能包含表达式。这样,编译器或者解释器就可以把尾递归做优化,使递归本身无论调用多少次,都只占用一个栈帧,不会出现栈溢出的情况。

上面的fact(n)函数由于return n * fact(n - 1)引入了乘法表达式,所以就不是尾递归了。要改成尾递归方式,需要多一点代码,主要是要把每一步的乘积传入到递归函数中:

def fact(n):
    return fact_iter(n, 1)

def fact_iter(num, product):
    if num == 1:
        return product
    return fact_iter(num - 1, num * product)
Python标准的解释器没有针对尾递归做优化,任何递归函数都存在栈溢出的问题。	    
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值