您的位置:首页 > 编程语言 > Python开发

自学python之路1——python基础

2019-03-14 15:49 274 查看

在廖雪峰的官方网站学习python,以下是python基础与函数两个模块的学习笔记,内容基本是引用上面的内容。第一篇博客非常乱,整理得不是很好。

  1. 1.输出

 

python:print(‘a%d%s’%(2,'3')

c++:printf("a%d%s",2,'3')

 

  1. 2.list相当于数组,但声明方法有区别:

 

[code]classmates = ['Michael', 'Bob', 'Tracy']

 

len(classmates)可以得到长度。classmates【0】(或其他数字)可以访问list中每个位置的元素。

append,insert,pop等可以直接用(类似于c中stl里的用法)

如果要取最后一个元素,除了计算索引位置外,还可以用

-1
做索引,直接获取最后一个元素:

 

 

[code]>>> classmates[-1]

 

 

 

与C的区别:

1.如果要取最后一个元素,除了计算索引位置外,还可以用

-1
做索引,直接获取最后一个元素:

[code]>>> classmates[-1]

2.tuple:元组,一旦初始化就不能更改。它也没有append(),insert()这样的方法。其他获取元素的方法和list是一样的,你可以正常地使用

classmates[0]
classmates[-1]
,但不能赋值成另外的元素。

需要注意的是:

 

要定义一个只有1个元素的tuple,如果你这么定义:

[code]>>> t = (1)
>>> t
1

定义的不是tuple,是

1
这个数!这是因为括号
()
既可以表示tuple,又可以表示数学公式中的小括号,这就产生了歧义,因此,Python规定,这种情况下,按小括号进行计算,计算结果自然是
1

所以,只有1个元素的tuple定义时必须加一个逗号

,
,来消除歧义:

[code]>>> t = (1,)
>>> t
(1,)

Python在显示只有1个元素的tuple时,也会加一个逗号

,
,以免你误解成数学计算意义上的括号。

三。条件判断

逻辑与c++类似,写法有区别

 

[code]age = 3
if age >= 18:
print('adult')
elif age >= 6:
print('teenager')
else:
print('kid')

1.if后无括号,2.elif写法不同。3.if后面要加冒号

 

四。循环

1.for 循环

 

[code]sum = 0
for x in range(101):
    sum = sum + x
print(sum)

对list里面每个元素都进行了操作,写法上比c++节省了很多。

 

还可以用函数range(x)来获取0-x的整数

上题结果为5050

2.while循环:

 

[code]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如下:

 

[code]>>> 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
语句:

[code]def nop():
pass

pass
语句什么都不做,那有什么用?实际上
pass
可以用来作为占位符,比如现在还没想好怎么写函数的代码,就可以先放一个
pass
,让代码能运行起来。

pass
还可以用在其他语句里,比如:

[code]if age >= 18:
pass

缺少了

pass
,代码运行就会有语法错误。

参数检查

1.参数个数不对,Python解释器会自动检查出来,并抛出

TypeError

[code]>>> my_abs(1, 2)
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: my_abs() takes 1 positional argument but 2 were given

2.类型错误

 

[code]>>> my_abs('A')
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "<stdin>", line 3, in my_abs
TypeError: bad operand type

不过abs函数内要加上类型检查否则检测不出来。python的参数不需要带类型,所以要在函数内部判断参数类型是否错误。。这个报错居然是要自己写的。

 

 

[code]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.默认参数:

 

[code]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的所有元素作为可变参数传进去。这种写法相当有用,而且很常见。

 

[code]def calc(*numbers):
sum = 0
for n in numbers:
sum = sum + n * n
return sum
[code]>>> calc(1, 2)
5
>>> calc()
0

3.关键字参数

 

可变参数允许你传入0个或任意个参数,这些可变参数在函数调用时自动组装为一个tuple。而关键字参数允许你传入0个或任意个含参数名的参数,这些关键字参数在函数内部自动组装为一个dict。

 

[code]def person(name, age, **kw):
print('name:', name, 'age:', age, 'other:', kw)
[code]>>> 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种参数都可以组合使用。但是请注意,参数定义的顺序必须是:必选参数、默认参数、可变参数、命名关键字参数和关键字参数。

[code]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解释器自动按照参数位置和参数名把对应的参数传进去。

[code]>>> 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,你也可以调用上述函数:

[code]>>> 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)
的形式调用它,无论它的参数是如何定义的。

 

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: