Python: How do I get this function to print? - python-3.x

#integers to be input
n = input('Enter \"n\" trials')
x = input('Enter \"x\" number of succeses')
p = input('Enter the probability \"p\" of success on a single trial')
#Probability Distribution function
def probDist(n, x, p):
q = (1-p)**(n-x)
numerator = math.factorial(n);
denominator = math.factorial(x)* math.factorial(n-x);
C = numerator / denominator;
answer = C*p**x*q;
return answer
# Does this have to come after I define the function? Or does this matter in Python
# Also this part just doesn't work.
dist = probDist(n, x, p);
print(dist);
Here's the error that I get after I run and I input all the values.
Traceback (most recent call last):
line 17, in <module>
dist = probDist(n, x, p);
line 9, in probDist
q = (1-p)**(n-x)
TypeError: unsupported operand type(s) for -: 'int' and 'str'

In Python 3.x, input always returns a string, without applying eval the the user input. Python 2.x input does eval, but that's rarely what you want. If you want an integer, use int(input(...)) and if you want a float (not quite the same as a real number, as it has only limited range!), use float(input). (You should propably catch ValueError to handle the cases where the input is not appropiate; if this is for exercise/education, it's propably okay to leave error handling out for now.)

Does this have to come after I define the function?
Yes.
q = (1-p)**(n-x)
TypeError: unsupported operand type(s) for -: 'int' and 'str'
You have two - operations. One of those two is a mixture of int and str data.
Let's go through each operand.
1 - int
p - result of input(), and therefore a string
n - result of input(), and therefore a string
x - result of input(), and therefore a string
You probably want to do something to convert the results of input() to a proper floating-point value. float() works well for this.

Related

invalid literal for int() with base 10: '1.0' [duplicate]

This question already has answers here:
ValueError: invalid literal for int() with base 10: ''
(15 answers)
Closed last month.
I wrote a program to solve y = a^x and then project it on a graph. The problem is that whenever a < 1 I get the error:
ValueError: invalid literal for int () with base 10.
Any suggestions?
Here's the traceback:
Traceback (most recent call last):
File "C:\Users\kasutaja\Desktop\EksponentfunktsioonTEST - koopia.py", line 13, in <module>
if int(a) < 0:
ValueError: invalid literal for int() with base 10: '0.3'
The problem arises every time I put a number that is smaller than one, but larger than 0. For this example it was 0.3 .
This is my code:
# y = a^x
import time
import math
import sys
import os
import subprocess
import matplotlib.pyplot as plt
print ("y = a^x")
print ("")
a = input ("Enter 'a' ")
print ("")
if int(a) < 0:
print ("'a' is negative, no solution")
elif int(a) == 1:
print ("'a' is equal with 1, no solution")
else:
fig = plt.figure ()
x = [-2,-1.75,-1.5,-1.25,-1,-0.75,-0.5,-0.25,0,0.25,0.5,0.75,1,1.25,1.5,1.75,2]
y = [int(a)**(-2),int(a)**(-1.75),int(a)**(-1.5),int(a)**(-1.25),
int(a)**(-1),int(a)**(-0.75),int(a)**(-0.5),int(a)**(-0.25),
int(a)**(0),int(a)**(0.25),int(a)**(0.5),int(a)**(0.75),
int(a)**1,int(a)**(1.25),int(a)**(1.5),int(a)**(1.75), int(a)**(2)]
ax = fig.add_subplot(1,1,1)
ax.set_title('y = a**x')
ax.plot(x,y)
ax.spines['left'].set_position('zero')
ax.spines['right'].set_color('none')
ax.spines['bottom'].set_position('zero')
ax.spines['top'].set_color('none')
ax.spines['left'].set_smart_bounds(True)
ax.spines['bottom'].set_smart_bounds(True)
ax.xaxis.set_ticks_position('bottom')
ax.yaxis.set_ticks_position('left')
plt.savefig("graph.png")
subprocess.Popen('explorer "C:\\Users\\kasutaja\\desktop\\graph.png"')
def restart_program():
python = sys.executable
os.execl(python, python, * sys.argv)
if __name__ == "__main__":
answer = input("Restart program? ")
if answer.strip() in "YES yes Yes y Y".split():
restart_program()
else:
os.remove("C:\\Users\\kasutaja\\desktop\\graph.png")
Answer:
Your traceback is telling you that int() takes integers, you are trying to give a decimal, so you need to use float():
a = float(a)
This should work as expected:
>>> int(input("Type a number: "))
Type a number: 0.3
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
ValueError: invalid literal for int() with base 10: '0.3'
>>> float(input("Type a number: "))
Type a number: 0.3
0.3
Computers store numbers in a variety of different ways. Python has two main ones. Integers, which store whole numbers (ℤ), and floating point numbers, which store real numbers (ℝ). You need to use the right one based on what you require.
(As a note, Python is pretty good at abstracting this away from you, most other language also have double precision floating point numbers, for instance, but you don't need to worry about that. Since 3.0, Python will also automatically convert integers to floats if you divide them, so it's actually very easy to work with.)
Previous guess at answer before we had the traceback:
Your problem is that whatever you are typing is can't be converted into a number. This could be caused by a lot of things, for example:
>>> int(input("Type a number: "))
Type a number: -1
-1
>>> int(input("Type a number: "))
Type a number: - 1
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
ValueError: invalid literal for int() with base 10: '- 1'
Adding a space between the - and 1 will cause the string not to be parsed correctly into a number. This is, of course, just an example, and you will have to tell us what input you are giving for us to be able to say for sure what the issue is.
Advice on code style:
y = [int(a)**(-2),int(a)**(-1.75),int(a)**(-1.5),int(a)**(-1.25),
int(a)**(-1),int(a)**(-0.75),int(a)**(-0.5),int(a)**(-0.25),
int(a)**(0),int(a)**(0.25),int(a)**(0.5),int(a)**(0.75),
int(a)**1,int(a)**(1.25),int(a)**(1.5),int(a)**(1.75), int(a)**(2)]
This is an example of a really bad coding habit. Where you are copying something again and again something is wrong. Firstly, you use int(a) a ton of times, wherever you do this, you should instead assign the value to a variable, and use that instead, avoiding typing (and forcing the computer to calculate) the value again and again:
a = int(a)
In this example I assign the value back to a, overwriting the old value with the new one we want to use.
y = [a**i for i in x]
This code produces the same result as the monster above, without the masses of writing out the same thing again and again. It's a simple list comprehension. This also means that if you edit x, you don't need to do anything to y, it will naturally update to suit.
Also note that PEP-8, the Python style guide, suggests strongly that you don't leave spaces between an identifier and the brackets when making a function call.
As Lattyware said, there is a difference between Python2 & Python3 that leads to this error:
With Python2, int(str(5/2)) gives you 2.
With Python3, the same gives you: ValueError: invalid literal for int() with base 10: '2.5'
If you need to convert some string that could contain float instead of int, you should always use the following ugly formula:
int(float(myStr))
As float('3.0') and float('3') give you 3.0, but int('3.0') gives you the error.
It might be better to validate a right when it is input.
try:
a = int(input("Enter 'a' "))
except ValueError:
print('PLease input a valid integer')
This either casts a to an int so you can be assured that it is an integer for all later uses or it handles the exception and alerts the user
int() casting can't handle string numbers that have decimal points
- example --> int('13.5') will give you error , but int('13') will convert the
string to integer
Why : This considered as explicit casting required by the user as it prevents you from losing information like 0.5 if you read dataset and don't know it's had floating-point numbers
Work Around >
int(Float("13.5"))
A real-world example I faced: where I wanted the numbers as int while int(I["mpg"]) directly didn't work so I used float() then int()
sum([int(float(i["mpg"])) for i in file])//len(file)

python3 returns unsupported operand when bit shifting an element in a list?

I have a list of hex values and I need to shift eacgh element by 9 and combine the result with another list. I have provided an example below of what I tried.
x = [hex(10), hex(11)]
y = x[0] << 1
This results in an error:
TypeError: unsupported operand type(s) for <<: 'str' and 'int'
While the below code works as I like but returns an int
x = [0xa, 0xb]
y = x[0] << 1
My question is how can I get the first code example to work?
I understand that the list is returning a string and not an int. I tried to type cast from a str to a hex, but this caused an error. I then tried to type cast from the string to int to hex and received an error for the str to int type cast.
I need to result to be stored as a hex in the list so changing the list to integers would not work for me.
The best way is to use the constructor 'int' with basis 16 to convert the hex values to integers, then use the bitwise operators
a=hex(10)
b=hex(11)
x = [int(a,16),int(b,16)]
y = x[0] << 1
print(x)
print(y)
You can convert hex strings to integers using
int(hex(10), base=16)
but that would just return 10.
If you have a list of integers, I would first shift them the amount you need to shift them by, and then convert them to hexadecimal strings using hex. The value of a hex and its integers are the same, e.g. 0xa == 10 is True. But hex(10) returns a string.
So
nums = [10, 11, ...]
nums = [x << 9 for x in nums]
hex_nums = map(hex, nums)
or something similar.

Unable to resolve Can't convert 'int' object to str implicitly

I am trying to solve this problem where certain numbers are taken and appended into the list.
After that I want to see that the first element is smaller than the next element if yes then remove it from the list.
But during comparison it is throwing this error.
I am new to python and don't know how to resolve this
I've tried to take the input in a different way but still can't solve it.
n=int(input())
l = []
m=input().split()
l.append(m)
print(m)
for i in m:
j=i+1
if i<j:
m.remove(i)
print(m)
It is showing the given error:
Traceback (most recent call last):
File "main.py", line 7, in <module>
j=i+1
TypeError: Can't convert 'int' object to str implicitly
Without knowing your input, I can tell you that the elements of m are strings. The return type of input() is a string and you've created a list of strings in m. You can do j = int(i) + 1 to make that line of code work, but you'll have a lot more work to do to solve your overall problem. i<j will always evaluate to True given the above line.
m = input().split() returns an iterable of strings, split by whitespace. If these are supposed to be integers, you've got to cast it to an integer. Do:
n=int(input())
l = []
m=input().split()
l.append(m)
print(m)
for i in m:
j=int(i)+1 # i is cast to an integer
if i<j:
m.remove(i)
print(m)

TypeError: 'float' object cannot be interpreted as an integer 4

I'm trying to create sudoku, but I'm getting this error. I think it's because of the range line; maybe I'm doing it wrong, but range(int(numb/numb+3)) doesn't really work either. Thanks for the help.
File "D:\Games\Python\sudokuV2Test2.py", line 83, in estDansSousMatrice
for i in range(bl, bl+3):
TypeError: 'float' object cannot be interpreted as an integer"
This is the code:
def estDansSousMatrice(grille,l,c,v):
bc=(c/3)*3
bl=(l/3)*3
for i in range(bl, bl+3):
for j in range(bc,bc+3):
if grille[i][j]==v:
return True
return False
Since your previously dividing bc and bl and then multiplying by 3, say we input c = 3 and l = 3 the outcomes for both of those would be 3.0
instead do for i in range(int(bl),int(bl)+3): and for j in range(int(bc),int(bc)+3):
To be clear, you can sidestep the converting back to int by never making them floats in the first place. The // operator performs integer division, truncating the result. This lets you keep almost all of your original code.
def estDansSousMatrice(grille,l,c,v):
bc=(c//3)*3 # Different
bl=(l//3)*3 # Different
for i in range(bl, bl+3):
for j in range(bc,bc+3):
if grille[i][j]==v:
return True
return False

TypeError, Palindrome Testing (Python 3.x)

I have made a program in Python 3, which tests whether a number is a palindrome. Obviously it is not done, but when I try to run it:
#!/usr/bin/env python
def testforpalin():
i = 101
lop = list(str(i))
print(lop)
len(lop)
if lop[0] == lop[len-1]:
print("hi")
testforpalin()
TypeError: unsupported operand type(s) for -: 'builtin_function_or_method' and 'int'
I get that error. How do I fix this?
in the line
if lop[0] == lop[len-1]:
you have len-1 where len is the function that gives you the length of the string (hence the error - you are trying to do subtraction where one of the values is len which is a "builtin_function_or_method"). you probably mean lop[len(lop)-1] (which would work), but it would be simpler to do:
if lop[0] == lop[-1]:
because [-1] gives you the last element in a string or array (and [-2] gives you next-to-last, etc).

Resources