在廖雪峰的官方网站学习python,以下是python基础与函数两个模块的学习笔记,内容基本是引用上面的内容。第一篇博客非常乱,整理得不是很好。
python:print(‘a%d%s’%(2,'3')
c++:printf("a%d%s",2,'3')
classmates = ['Michael', 'Bob', 'Tracy']
len(classmates)可以得到长度。classmates【0】(或其他数字)可以访问list中每个位置的元素。
append,insert,pop等可以直接用(类似于c中stl里的用法)
如果要取最后一个元素,除了计算索引位置外,还可以用-1
做索引,直接获取最后一个元素:
>>> classmates[-1]
与C的区别:
1.如果要取最后一个元素,除了计算索引位置外,还可以用-1
做索引,直接获取最后一个元素:
>>> classmates[-1]
2.tuple:元组,一旦初始化就不能更改。它也没有append(),insert()这样的方法。其他获取元素的方法和list是一样的,你可以正常地使用classmates[0]
,classmates[-1]
,但不能赋值成另外的元素。
需要注意的是:
要定义一个只有1个元素的tuple,如果你这么定义:
>>> t = (1)
>>> t
1
定义的不是tuple,是1
这个数!这是因为括号()
既可以表示tuple,又可以表示数学公式中的小括号,这就产生了歧义,因此,Python规定,这种情况下,按小括号进行计算,计算结果自然是1
。
所以,只有1个元素的tuple定义时必须加一个逗号,
,来消除歧义:
>>> t = (1,)
>>> t
(1,)
Python在显示只有1个元素的tuple时,也会加一个逗号,
,以免你误解成数学计算意义上的括号。
三。条件判断
逻辑与c++类似,写法有区别
age = 3
if age >= 18:
print('adult')
elif age >= 6:
print('teenager')
else:
print('kid')
1.if后无括号,2.elif写法不同。3.if后面要加冒号
四。循环
1.for 循环
sum = 0
for x in range(101):
sum = sum + x
print(sum)
对list里面每个元素都进行了操作,写法上比c++节省了很多。
还可以用函数range(x)来获取0-x的整数
上题结果为5050
2.while循环:
n = 1
while n <= 100:
print(n)
n = n + 1
print('END')
与if一样无括号,后门要加冒号。
循环中break与continue用法与c++一样。
五.dict&set
Python内置了字典:dict的支持,dict全称dictionary,在其他语言中也称为map,使用键-值(key-value)存储,具有极快的查找速度。
如果用dict实现,只需要一个“名字”-“成绩”的对照表,直接根据名字查找成绩,无论这个表有多大,查找速度都不会变慢。用Python写一个dict如下:
>>> d = {'Michael': 95, 'Bob': 75, 'Tracy': 85}
>>> d['Michael']
95
dict的key必须是不可变对象。
set:set可以看成数学意义上的无序和无重复元素的集合,因此,两个set可以做数学意义上的交集、并集等操作:
set和dict的唯一区别仅在于没有存储对应的value,但是,set的原理和dict一样,所以,同样不可以放入可变对象,因为无法判断两个可变对象是否相等,也就无法保证set内部“不会有重复元素”。试试把list放入set,看看是否会报错。
不可变对象:比如list
六函数
python函数库:https://docs.python.org/3/library/functions.html#abs
1.函数的定义
在Python中,定义一个函数要使用def
语句,依次写出函数名、括号、括号中的参数和冒号:
,然后,在缩进块中编写函数体,函数的返回值用return
语句返回。
写习惯了c++书写python有些小错误:
def my_abs(x):
if x >= 0:
return x
else:
return -x
def my_abs(x):
if x>=0:
return x;
else
return -x;
下面是自己写的错误代码:首先python不像c++,需要每行都加分号。然后else后门面也要有冒号。最后,因为python里面没有用{}来框住,所以必须保证缩进正确,否则会报错。
将上述代码保存为py文件后,在该文件的当前目录下启动Python解释器。(在我的电脑就是E:\Users\博伟\Desktop\PY文件>python)。然后导入函数就可以用啦
>>> from my_abs import my_abs
>>> my_abs(-9)
9
如果想定义一个什么事也不做的空函数,可以用pass
语句:
def nop():
pass
pass
语句什么都不做,那有什么用?实际上pass
可以用来作为占位符,比如现在还没想好怎么写函数的代码,就可以先放一个pass
,让代码能运行起来。
pass
还可以用在其他语句里,比如:
if age >= 18:
pass
缺少了pass
,代码运行就会有语法错误。
参数检查
1.参数个数不对,Python解释器会自动检查出来,并抛出TypeError
:
>>> my_abs(1, 2)
Traceback (most recent call last):
File " ", line 1, in
TypeError: my_abs() takes 1 positional argument but 2 were given
2.类型错误
>>> my_abs('A')
Traceback (most recent call last):
File " ", line 1, in
File " ", line 3, in my_abs
TypeError: bad operand type
不过abs函数内要加上类型检查否则检测不出来。python的参数不需要带类型,所以要在函数内部判断参数类型是否错误。。这个报错居然是要自己写的。
def my_abs(x):
if not isinstance(x, (int, float)):
raise TypeError('bad operand type')
if x >= 0:
return x
else:
return -x
python的函数可以返回多个变量,其原理其实是返回了一个tuple
参数:
1.默认参数:
def power(x, n=2):
s = 1
while n > 0:
n = n - 1
s = s * x
return s
窝滴c也有啦。
定义默认参数要牢记一点:默认参数必须指向不变对象!
比如不能L=[],要L=none 可以看廖雪峰的例子。
2.可变参数
这个比c可以说方便很多。*nums
表示把nums
这个list的所有元素作为可变参数传进去。这种写法相当有用,而且很常见。
def calc(*numbers):
sum = 0
for n in numbers:
sum = sum + n * n
return sum
>>> calc(1, 2)
5
>>> calc()
0
3.关键字参数
可变参数允许你传入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'}
对于关键字参数,函数的调用者可以传入任意不受限制的关键字参数。至于到底传入了哪些,就需要在函数内部通过kw
检查。
使用命名关键字参数时,要特别注意,如果没有可变参数,就必须加一个*
作为特殊分隔符。如果缺少*
,Python解释器将无法识别位置参数和命名关键字参数
在Python中定义函数,可以用必选参数、默认参数、可变参数、关键字参数和命名关键字参数,这5种参数都可以组合使用。但是请注意,参数定义的顺序必须是:必选参数、默认参数、可变参数、命名关键字参数和关键字参数。
def f1(a, b, c=0, *args, **kw):
print('a =', a, 'b =', b, 'c =', c, 'args =', args, 'kw =', kw)
def f2(a, b, c=0, *, d, **kw):
print('a =', a, 'b =', b, 'c =', c, 'd =', d, 'kw =', kw)
一个星号是list全部元素放进args 两个星号是传入字典啊
在函数调用的时候,Python解释器自动按照参数位置和参数名把对应的参数传进去。
>>> f1(1, 2)
a = 1 b = 2 c = 0 args = () kw = {}
>>> f1(1, 2, c=3)
a = 1 b = 2 c = 3 args = () kw = {}
>>> f1(1, 2, 3, 'a', 'b')
a = 1 b = 2 c = 3 args = ('a', 'b') kw = {}
>>> f1(1, 2, 3, 'a', 'b', x=99)
a = 1 b = 2 c = 3 args = ('a', 'b') kw = {'x': 99}
>>> f2(1, 2, d=99, ext=None)
a = 1 b = 2 c = 0 d = 99 kw = {'ext': None}
最神奇的是通过一个tuple和dict,你也可以调用上述函数:
>>> args = (1, 2, 3, 4)
>>> kw = {'d': 99, 'x': '#'}
>>> f1(*args, **kw)
a = 1 b = 2 c = 3 args = (4,) kw = {'d': 99, 'x': '#'}
>>> args = (1, 2, 3)
>>> kw = {'d': 88, 'x': '#'}
>>> f2(*args, **kw)
a = 1 b = 2 c = 3 d = 88 kw = {'x': '#'}
所以,对于任意函数,都可以通过类似func(*args, **kw)
的形式调用它,无论它的参数是如何定义的。